2

Web サービスを使用して大きなデータを送信しているときに、「メモリ不足の例外」が発生します。少量のデータでは問題なく動作します。シナリオは次のようなものです: ここに clsMovie というエンティティ クラスがあります。ここで、ユーザーは 250 MB を超える大きなファイルをアップロードします。このファイルは配列のバイトに変換され、clsMovie クラスの MovieData メンバーに割り当てられます。このクラスのオブジェクトが大量のデータ (配列の大きなバイト) を含む Web サービスに渡されると、"Out of Memory Exception" が発生します。

コードは次のとおりです。

MovieResponse objM = service.SaveProductMovie(objMovieEnt);     // I get "Out of Memory Exception".


    [DataContract]
    [Serializable]
    public class clsMovie
    {
        [DataMember]
        public byte[] MovieData { get; set; }

        [DataMember]
        public string MovieType { get; set; }

        [DataMember]
        public int MovieSize { get; set; }

    }

WSE 3.0 ツールを使用しようとしましたが、VS 2008 ではサポートされていません。誰にも解決策がありますか?

4

3 に答える 3

1

250 MB の配列を Web サービス経由で送信すると大量のメモリが消費されます。配列を処理するには、おそらく 250 MB の空きメモリの 3 倍が必要です。10 人のユーザーがアップロードするとどうなりますか? それに加えて、250 MB ファイルのサイズは、SOAP メッセージ (xml であり、すべてのバイトが char + xml タグに変換される) を作成する場合のサイズの約 10 倍になります。

大きなファイルを送信するには、webserices よりも優れたプロトコルがあります。たとえば、ftp を使用して、ftp アップロードが終了したときにアップロードされたファイルの名前を webserices 経由で送信できます。または、5 MB のチャックを作成し、最後のチャックがそこにあるときに組み合わせます。

于 2012-05-25T10:33:55.703 に答える
1

ストリーミング操作の使用を検討する必要があります。ここを見てください:

WCF ストリーミング: HTTP を介したファイルのアップロード/ダウンロード

于 2012-05-25T10:37:21.363 に答える
0

構成ファイルでバインディングのサイズ クォータを確認できます。

<basicHttpBinding>
   <binding name="BasicHttpBinding_ForgotPasswordService" closeTimeout="00:10:00"
       openTimeout="00:10:00" receiveTimeout="00:10:00" sendTimeout="00:10:00"
       allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
       maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
       messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
       useDefaultWebProxy="true">
    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
       maxBytesPerRead="4096" maxNameTableCharCount="16384" />
   </binding>
</basicHttpBinding>

ニーズに合わせて調整できmaxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"ます。

しかし、あなたの個々のケースでは、WCFのストリーミング機能を次のように検討することをお勧めします:「WCFの大きなデータとストリーミング」(MSDN)

[編集]

考えてみると、クォータの制限に達した場合、例外はおそらく異なり、「配列の最大長のクォータを超えました」などのように伝えます。

これOutOfMemoryExceptionは、少なくとも 1 つの通信システムの実際の制限に関係している可能性があります。考えられる原因は、メモリ リークが RAM にデータを詰め込み、適切に (または十分に速く) クリーンアップしないことです。

于 2012-05-25T10:49:55.150 に答える