2012-10-17 10 views
8

Sto restituendo Streams da un servizio remoto (.NET Remoting). Ma Streams sono anche articoli usa e getta che, come tutti sappiamo, sono da smaltire.Cosa succede sotto la copertina quando si restituisce un flusso da un oggetto remoto tramite .NET Remoting

Potrei chiamare Dispose sul lato client una volta che ho finito di consumarli. Tuttavia, vorrei sapere cosa succede esattamente sotto la copertina quando restituisco uno Stream da un oggetto remoto.

Soprattutto:

  1. Dovrei meglio leggere tutto in un byte[] e restituire che invece di un Stream?
  2. Oppure il servizio remoto di .NET fa esattamente questo per me sotto le coperte comunque?
  3. In caso contrario, in che modo restituire un valore Stream diverso da restituire uno byte[]? Alla fine, lo .NET Remoting deve in qualche modo serializzare i dati comunque?
  4. Il chiamare Dispose sul lato client ha addirittura alcun effetto? Esiste una connessione magica tra l'oggetto sul lato client e l'oggetto sul lato server? Penso che una volta che è deserializzata dietro le copertine, non ha senso chiamare il numero Dispose() sul lato client o c'è?

Sto rispondendo a Mike Bild qui perché voglio anche migliorare la domanda un po '

Ok, in modo che il flusso di parlare al server è (almeno per me) inaspettato.

Per cosume un oggetto remoto si deve fare qualcosa di simile:

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); 
    } 
} 

Così si sono esplicitamente che raggiunge fuori per un oggetto remoto specifico a un certo URI per consumare. E quando un metodo su quell'oggetto remoto restituisce un oggetto che eredita da MarshallByRefObject che significa che è associato automaticamente all'oggetto sul lato remoto? Ok, dovrebbe essere facile da riprodurre con un oggetto di prova che costruisco da solo. Quindi, questo significa anche che dovrei chiamare Dispose sul lato client e ottenere il proxy verso l'oggetto sul lato server?

+0

MarshalByRefObject deve sempre implementare IDisposable per la gestione della durata sul lato client. Sì, invoca Dispose() sul lato client disponga l'oggetto "condiviso" sul lato server. –

+0

la mia raccomandazione - implementare IDisposable per tutti i tipi che coinvolgono oggetti MBR finché non materializzi il flusso in memoria come array di byte o un nuovo stream come un file –

+0

Ok, sei corretto al 100% :) Ho appena restituito un oggetto personalizzato che eredita da MBR e impostare i punti di interruzione per renderlo visibile. Ho sempre una domanda insana per rendere le cose visibili :) L'aspetto divertente è: ho scritto un ApplicationServer generico che includeva un NotificationService a due vie nel 2009 che non sarebbe stato possibile senza le cose che funzionano in questo modo. http://www.mycsharp.de/wbb2/thread.php?threadid=75670 Devo averlo dimenticato in mezzo. Ad ogni modo, benissimo hai preso il tempo per rinfrescarmi il cervello! – Christoph

risposta

Problemi correlati