1

これが私の WCF REST エンドポイントです。

[WebInvoke(Method = "POST", UriTemplate = "_test/upload")]
public void UploadImage(Stream data)
{
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.OK;
    try
    {
        var parser = new MultipartParser(data);
        var ext = Path.GetExtension(parser.Filename);
        var filename = string.Format("{0}{1}", Guid.NewGuid().ToString("N"), ext);
        var folder = HttpContext.Current.Server.MapPath(@"~\Uploads\");
        var filepath = Path.Combine(folder, filename);
        File.WriteAllBytes(filepath, parser.FileContents);
    }
    catch (Exception)
    {
        WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.InternalServerError;
    }
}

ここからマルチパート パーサーを使用しています: http://antscode.blogspot.com/2009/11/parsing-multipart-form-data-in-wcf.html

私の問題は、上記が一部のファイル (.bat、.txt、.cs、.doc) でうまく機能することです。Fiddler では、200 (OK) ステータスを含むすべての良好な兆候が見られます。

他のファイル (.xls、.vsd) をアップロードしようとすると、400 (Bad Request) ステータスで失敗します。.doc が機能し、.xls と .vsd が失敗することに非常に驚いています。

それも一貫しています。失敗することなく、いくつかの .doc ファイルを正常にアップロードしました。また、いくつかの .xls ファイルをアップロードしようとしました - いくつかは成功し、いくつかは失敗しました (成功は何度も一貫しており、失敗は何度も一貫しています)。これを書いてさらに多くのファイルをテストすると、一貫して 504 (Fiddler - Receive Failure) エラーを生成する .pdf ファイルがあります。

参考までに、クライアントで Flex を使用し、FileReference クラスを使用してアップロードを行っています。Flex コードは標準のままです - WCF REST URL を変更するだけでこのコードを使用します: http://blog.flexexamples.com/2007/09/21/uploading-files-in-flex-using-the -ファイル参照クラス/

いくつかの失敗といくつかの成功が見られる理由は何ですか? 2つの違いがわかりませんか?

前もって感謝します。

4

1 に答える 1

2

成功しているファイルのサイズを確認し、web.config で webHttpBinding の maxReceivedMessageSize を調整することができます。デフォルトではわずか 64KB です。私はそれを上げるまで同様の問題を経験していました(ここでは1000倍しています)。また、requestValidationMode を 2.0 に設定し、pages.validateRequest を false に設定して、「危険な」アップロードがブロックされないようにします。

これらの変更によりうまくいきましたが、約 4MB を超えるファイルで問題が発生しました (maxReceivedMessageSize の設定に関係なく)。httpRuntime の maxRequestLength を増やす必要がある問題を修正しました。

transferMode を StreamedRequest に設定しましたが、この方法でファイルをアップロードすると IIS のパフォーマンスやサービス拒否攻撃にどのような影響があるかわかりません。ストリーミングモードでかなり安全だと思います。これは、 Large Data and Streamingに関する適切な MSDN の記事です。このような巨大なリクエストを避けるために、以前はチャンキング クライアントを使用していました。

<system.web>
    <httpRuntime requestValidationMode="2.0" maxRequestLength="65536000" />
    <pages validateRequest="false" />

<!-- (etc.) -->
</system.web>
<!-- (etc.) -->
<system.serviceModel>
     <bindings>
         <webHttpBinding>
             <binding maxReceivedMessageSize="65536000" transferMode="StreamedRequest">
                <security mode="None" />
              </binding>
         </webHttpBinding>
    </bindings>
</system.serviceModel>
于 2011-05-18T18:17:51.227 に答える