generate - remarks c#
¿Es necesario cerrar el método Stream of WebInvoke? (1)
Tengo una interfaz de servicio con un método que tiene un parámetro de tipo Stream
. ¿Debo cerrar la secuencia después de haber leído todos los datos de esta secuencia o esto es hecho por WCF Runtime cuando se completa la llamada al método?
La mayoría de los ejemplos que he visto, solo leen los datos de la transmisión, pero no llaman Cerrar o Eliminar en la transmisión.
Normalmente, diría que no tengo que cerrar la transmisión porque la clase no es la propietaria de la transmisión, pero la razón es por qué es que esta pregunta es que actualmente estamos investigando un problema en nuestro sistema, que algunos clientes de Android, que utilizar HTTP-Post para enviar datos a este servicio algunas veces tienen conexiones abiertas que no están cerradas (Analizado con netstat
que lista conexiones ESTABLECIDAS de Tcp).
[ServiceContract]
public interface IStreamedService {
[OperationContract]
[WebInvoke]
Stream PullMessage(Stream incomingStream);
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall, UseSynchronizationContext = false)]
public class MyService : IStreamedService {
public System.IO.Stream PullMessage(System.IO.Stream incomingStream) {
// using(incomingStream) {
// Read data from stream
// }
Stream outgoingStream = // assigned by omitted code;
return outgoingStream;
}
Configuración del Servicio / Enlace
<webHttpBinding>
<binding name="WebHttpBindingConfiguration"
transferMode="Streamed"
maxReceivedMessageSize="1048576"
receiveTimeout="00:10:00"
sendTimeout="00:10:00"
closeTimeout="00:10:00"/>
</webHttpBinding>
La propiedad que controla el comportamiento de cerrar o no cerrar el parámetro es la propiedad OperationBehaviorAttribute.AutoDisposeParameters
y se puede utilizar para desviarse del comportamiento predeterminado de true con respecto al parámetro Stream
que se cierra una vez que sale del método. Esta es la razón por la que a menudo no ve el cierre explícito del parámetro. Si desea anular el comportamiento predeterminado, puede tomar el control explícito y cerrar el flujo una vez que la operación se haya completado a través del evento OperationCompleted .
public Stream GetFile(string path) {
Sream fileStream = null;
try
{
fileStream = File.OpenRead(path);
}
catch(Exception)
{
return null;
}
OperationContext clientContext = OperationContext.Current;
clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args)
{
if (fileStream != null)
fileStream.Dispose();
});
return fileStream;
}
Tenga en cuenta que está recibiendo su propia copia de Stream
, no una referencia a Stream
los clientes y, por lo tanto, es responsable de cerrarla.