29

byte[] を受け取って保存する Web サービスがあります。

これは「小さな」ファイルに対しては正常に機能しますが、特定のサイズに達すると Web サービスが失敗し、「HTTP ステータス 404 で要求が失敗しました: 見つかりません」が返されます。

私が見たところ、これは (サービス拒否攻撃を防ぐために) 投稿できるファイルのサイズを制限する IIS 設定のようです。その設定を増やしてみましたが、どの設定をどこでどのように設定するかを判断するのに苦労しています。IIS7 を使用しており、Web サービスは .net (asmx) で実行されます。

Web サービスの web.config に以下を追加しました (これにより、受け入れられるファイルのサイズが大きくなるように見えましたが、この設定サイズまでではありませんでした)。

  <system.web>
     <httpRuntime executionTimeout="999999" maxRequestLength="2097151" />
     ...
  </system.web>

Web サービスのファイル サイズをどこで (およびどのように) 大きくするかについての提案をいただければ幸いです。

4

8 に答える 8

33

質問に記載されている httpRuntime/maxRequestLength に加えて、Web サービスの web.config ファイルに追加して大きなファイルの転送を許可できる項目があるようです。

  <system.webServer>
    <security>
      <requestFiltering>
        <requestLimits maxAllowedContentLength="2000000000" />
      </requestFiltering>
    </security>
  </system.webServer>

これにより、より大きなファイルを Web サービス経由でアップロードできるようになります。

于 2009-06-30T23:28:35.683 に答える
6

Web サービスは、主にファイル転送メカニズムとして設計されているわけではないことに注意してください。目的に合わせて設計されたファイル転送プロトコルは、Web サービスよりも優れた機能を発揮する可能性があります。たとえば、そのようなプロトコルは、エラー回復、部分的なアップロードなどを処理する可能性が高くなります。

ただし、.NET でこの目的のために Web サービスを使用する場合は、可能な限り WCF を使用する必要があります。他の利点の中でも特に、WCF はストリーミングを処理するため、メモリ使用の点ではるかに効率的になります。上記の 2 つの (正確な) 提案に従った場合、古い ASMX テクノロジは 25 MB のファイル全体を一度にメモリにロードしようとするため、次の結果は「メモリ不足またはリソース不足」の例外になるのではないかと心配しています。実際、同時に複数のコピーがメモリに存在する場合があります。

于 2009-06-15T23:38:33.297 に答える
5

Web サービスを使用する必要があり、非常に大きなファイルをサポートする必要がある場合は、ファイルを分割してアップロードできるシステムの実装を検討します。

例えば。

  • ticketId GetTicket(サイズ)
  • UploadData(ticketId, byte[] payload) (これは何度でも呼び出すことができます)
  • FinalizeUpload(チケットID)

これにより、大量のアップロードをチャンクアップし、メモリに保持しすぎるデータを抑えることができます。欠点は、かなり非効率的なトランスポート メカニズムを使用していることです。

于 2009-06-15T23:58:22.017 に答える
5

このweb.configをグーグルで検索している人々に情報を追加するだけです:

C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\12\ISAPI

<location path="Copy.asmx"> <!-- Name of you asmx -->
    <system.webServer>
      <security>
        <requestFiltering>
          <requestLimits maxAllowedContentLength="104857600"/> <!-- 100 megs -->
        </requestFiltering>
      </security>
    </system.webServer>
  </location>

これにより、この問題をかなり長い間トラブルシューティングした後、問題が解決しました。

于 2010-10-19T09:01:59.127 に答える
4

Web サービスを使用してファイルを移動することに設定している場合は、少なくとも WS-Attachment / DIME 添付ファイルの使用を検討します。byte[] を Web サービス経由で送信する際の主な問題は、base 64 文字列としてエンコードされる SOAP 本文に入れられることです。このようにファイルをエンコードすると、soap 本体でファイルのサイズが3 分の 2 も大きくなります (つまり、6 MB のファイルがネットワーク経由で 9 MB のファイルになります)。

25 MB のアップロードが巨大な石鹸の封筒に変わっている可能性があります。

これを読むことを強くお勧めします。これはあなたをDIMEに導くかもしれません。

ここに抜粋があります。

Microsoft の WSE Toolkit を使用すると、DIME および WS-Attachments 標準を使用して、大きな添付ファイルを Web サービス メソッドと共に送信できます。これらの標準と、Web サービス呼び出しで大量のバイナリ データを他の一般的な手段で送信するよりも効率的である理由を調べます。

それが役立つことを願っています!

于 2009-06-15T23:47:34.007 に答える
1

これは私のために働いた:

            <binding name="uploadFilesBasicHttpBinding" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" maxBufferPoolSize="2147483647" receiveTimeout="00:10:10" sendTimeout="00:10:00" openTimeout="00:10:00" closeTimeout="00:10:00">
                <readerQuotas maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="2147483647" maxNameTableCharCount="2147483647" maxStringContentLength="2147483647"/>
                <security mode="TransportWithMessageCredential">
                    <message clientCredentialType="UserName"/>
                </security>
            </binding>
于 2011-11-14T17:11:56.257 に答える
1

maxRequestLength はバイト単位ではなく KB 単位です。これにより、4 分間のタイムアウト ウィンドウ内で 30 MB の制限が与えられます。

<httpRuntime executionTimeout="240" maxRequestLength="30000" />

数値が高すぎると、実際には値が適用されない可能性があります。バイト制限だと思っていた数年前に、これに遭遇したと思います(あいまいな記憶)

于 2009-06-15T23:32:12.857 に答える
1

これはあなたの質問に具体的に答えるものではありませんが、私が過去に行ったことは、WCF を使用してファイル名/パス/リストを転送し、次に FTP ライブラリを使用して FTP 経由でファイルを転送することです。

于 2009-06-15T23:41:43.867 に答える