1

ファイルの 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」でした。

内部例外: 確立された接続が、ホスト マシンのソフトウェアによって中止されました

事前に助けてくれてありがとう。

4

1 に答える 1

0

あなたのMaxReceivedMessageSize(そしておそらくMaxBufferPoolSize) が約 194 メガバイトに設定されているからだと思います。2倍408006400(約400MB)にしてみてください。

これを次のように変更します。

tcp.MaxBufferPoolSize = 408006400;
tcp.MaxReceivedMessageSize = 408006400;

MSDNを読むと、これが問題になるとは思いませんMaxBufferPoolSize(ただし、念のために増やす価値はあります)。これが機能する場合は、200 MB の制限にリセットして、もう一度テストしてください。

これが発生する理由は、サーバーが 204003200 バイト (194mb) の転送に達すると、サーバーが転送を中止するためです。これは、誰かが非常に大きなファイルをアップロードしてサーバーを詰まらせたり、ユーザーによる過剰な使用を防止したりする悪意のある使用を防ぐための設計です。

于 2013-07-14T21:35:38.727 に答える