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:
- Dovrei meglio leggere tutto in un
byte[]
e restituire che invece di unStream
? - Oppure il servizio remoto di .NET fa esattamente questo per me sotto le coperte comunque?
- In caso contrario, in che modo restituire un valore
Stream
diverso da restituire unobyte[]
? Alla fine, lo.NET Remoting
deve in qualche modo serializzare i dati comunque? - 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 numeroDispose()
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?
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. –
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 –
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