我有一個服務接口,其方法的參數類型爲Stream
。我應該關閉流後,我從這個流中讀取所有數據,或者當方法調用完成時由WCF運行時完成?是否需要關閉WebInvoke方法流
我見過的大多數例子都只是從流中讀取數據,但不要在流上調用Close或Dispose。
通常我會說我不必關閉流,因爲類不是流的所有者,但原因是爲什麼要問這個問題是我們目前正在調查我們的系統中的一個問題,使用HTTP-Post將數據發送到此服務的Android客戶端有時會打開未關閉的連接(使用netstat
進行分析,其中列出了建立的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;
}
配置的服務/結合
<webHttpBinding>
<binding name="WebHttpBindingConfiguration"
transferMode="Streamed"
maxReceivedMessageSize="1048576"
receiveTimeout="00:10:00"
sendTimeout="00:10:00"
closeTimeout="00:10:00"/>
</webHttpBinding>
把它作爲評論,因爲我不是100%確定。我認爲你應該關閉'Stream',因爲對方在返回給你之前無法關閉它。我意識到這是 - 就像你說的 - 反直覺。另外,我不認爲一個開放的tcp連接與'Stream'開放有關......它可能會被關閉。 – pleinolijf
@albertjan有沒有原因爲什麼你這樣寫評論或者你只是無法寫出整句話?我不明白你想說什麼。你能否詳細說明一下? – seba