2012-10-17 58 views
8

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:

  1. powinienem lepiej czytać wszystko w byte[] i powrócić że zamiast Stream?
  2. A może .NET remoting robi dokładnie to dla mnie pod kołdrą?
  3. Jeśli nie, w jaki sposób zwraca Stream różni się od zwracania byte[]? W końcu, .NET Remoting musi w jakiś sposób serializować dane?
  4. 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 numer Dispose() 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.

+0

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. –

+0

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 –

+0

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

Odpowiedz

Powiązane problemy