ファイルの WCF ストリーミングに少し問題があります。300 MB 未満のファイルをサーバーにストリーミングすることはできますが、300 MB 以上のファイルを試してみると、「確立された接続がホスト マシンのソフトウェアによって中止されました」というエラーが 60% 前後で発生します。 . このエラーは、ファイルが完了する前に接続を閉じているように聞こえますが、見つかりません。
私が持っているクライアント コードは、接続を開き、アップロード メソッドを呼び出し、戻りを待ってから、接続を閉じます。これは、小さなファイルに対してはうまく機能します。
WCF サーバーは、net.tcp バインドを使用して、Windows サービスでホストされます。バッファサイズなどを変更してみましたが、まだうまくいきません。
この問題を追跡するための支援を探しています。
サーバー側バインディング:
NetTcpBinding tcp = new NetTcpBinding(SecurityMode.None);
tcp.SendTimeout = TimeSpan.FromMinutes(10);
tcp.ReceiveTimeout = TimeSpan.FromMinutes(10);
tcp.MaxBufferSize = 65536; // 16384;
tcp.MaxBufferPoolSize = 204003200; // 655360;
tcp.MaxReceivedMessageSize = 204003200; // 2147483647;
tcp.TransferMode = TransferMode.Streamed;
tcp.ReaderQuotas = new XmlDictionaryReaderQuotas()
{
MaxArrayLength = 2147483647
};
クライアント側バインディング:
NetTcpBinding tcp = new NetTcpBinding(SecurityMode.None);
tcp.SendTimeout = TimeSpan.FromMinutes(10);
tcp.ReceiveTimeout = TimeSpan.FromMinutes(10);
tcp.MaxBufferSize = 65536; // 16384;
tcp.MaxBufferPoolSize = 204003200; // 655360;
tcp.MaxReceivedMessageSize = 204003200; // 2147483647;
tcp.TransferMode = TransferMode.Streamed;
tcp.ReaderQuotas = new XmlDictionaryReaderQuotas()
{
MaxArrayLength = 2147483647
};
ファイル ストリームに使用するクラス:
[MessageContract]
public class DataFileStream
{
[MessageHeader(MustUnderstand = true)]
public String ID { get; set; }
[MessageHeader(MustUnderstand = true)]
public String FileName { get; set; }
[MessageHeader(MustUnderstand = true)]
public long FileSize { get; set; }
[MessageBodyMember(Order = 1)]
public Stream StreamData { get; set; }
}
そして私が受け取るエラー:
例外: ソケット接続が中止されました。これは、メッセージの処理中にエラーが発生したか、リモート ホストが受信タイムアウトを超過したか、基になるネットワーク リソースの問題が原因である可能性があります。ローカル ソケットのタイムアウトは「00:48:35.9230000」でした
内部例外: 書き込み操作が失敗しました。内部例外を参照してください。
内部例外: ソケット接続が中止されました。これは、メッセージの処理中にエラーが発生したか、リモート ホストが受信タイムアウトを超過したか、基になるネットワーク リソースの問題が原因である可能性があります。ローカル ソケットのタイムアウトは「00:48:35.9230000」でした。
内部例外: 確立された接続が、ホスト マシンのソフトウェアによって中止されました
事前に助けてくれてありがとう。