Wracam Streams
ze zdalnego serwisu (.NET Remoting
). Ale Streams
są również elementami jednorazowymi, które, jak wszyscy wiemy, są przeznaczone do usunięcia.Co dzieje się pod pokrywą po zwróceniu strumienia ze zdalnego obiektu przez .NET Remoting
Mogę zadzwonić pod numer Dispose
po stronie klienta, gdy je skończyłem. Chciałbym jednak wiedzieć, co dokładnie dzieje się pod pokrywą, gdy zwracam obiekt Stream
z obiektu zdalnego.
Zwłaszcza:
- powinienem lepiej czytać wszystko w
byte[]
i powrócić że zamiastStream
? - A może .NET remoting robi dokładnie to dla mnie pod kołdrą?
- Jeśli nie, w jaki sposób zwraca
Stream
różni się od zwracaniabyte[]
? W końcu,.NET Remoting
musi w jakiś sposób serializować dane? - Czy wywoływanie
Dispose
po stronie klienta ma nawet wpływ? Czy istnieje magiczne połączenie między obiektem po stronie klienta a obiektem na serwerze? Myślę, że po deserializacji za okładkami, nie ma sensu dzwonić pod numerDispose()
po stronie klienta, czy jest tam?
ja odpowiadając Mike Bild tutaj, bo też chcą poprawić pytanie trochę
Ok, więc strumień rozmawiać z powrotem do serwera jest (przynajmniej dla mnie) nieoczekiwane.
Aby cosume obiekt zdalny trzeba zrobić coś takiego:
public static class ServiceFactory <T>
{
public static T CreateProxy()
{
Type interfaceType = typeof(T);
string uri = ApplicationServer.ServerURL + interfaceType.FullName;
return (T)Activator.GetObject(interfaceType, uri);
}
}
Więc są wyraźnie dotarcia do konkretnego obiektu zdalnego w pewnym URI do konsumpcji. A kiedy metoda na tym zdalnym obiekcie zwraca obiekt, który dziedziczy po MarshallByRefObject, co oznacza, że jest automatycznie powiązany z obiektem po stronie zdalnej? Ok, to powinno być łatwe do odtworzenia za pomocą obiektu testowego, który sam zbudowałem. Oznacza to również, że powinienem zadzwonić do Dispose po stronie klienta, a następnie odesłać go do obiektu po stronie serwera.
MarshalByRefObject powinien zaimplementować IDisposable do zarządzania na całe życie po stronie klienta. Tak, wywołaj Dispose() po stronie klienta usuń "udostępniony" obiekt po stronie serwera. –
moja rekomendacja - implementuj IDisposable dla wszystkich typów, które obejmuje obiekty MBR, aż zmaterializujesz strumień do pamięci jak tablica bajtów lub nowy strumień jak plik –
OK, jesteś w 100% poprawny :) Właśnie zwróciłem obiekt niestandardowy, który dziedziczy z MBR i ustaw punkty przerwania, aby był widoczny. Zawsze mam szalony popyt, żeby wszystko było widoczne :) Zabawny aspekt: napisałem ogólny ApplicationServer zawierający dwukierunkową usługę powiadomień w 2009 roku, która nie byłaby możliwa bez rzeczy działających w ten sposób. http://www.mycsharp.de/wbb2/thread.php?threadid=75670 Musiałam o tym zapomnieć. W każdym razie świetnie, że poświęciłeś czas na odświeżenie mojego mózgu! – Christoph