【问题标题】:WCF REST Upload File (some files succeed - 200, some fail - 400 Bad Request)WCF REST 上传文件(一些文件成功 - 200,一些失败 - 400 错误请求)
【发布时间】:2011-04-19 05:54:11
【问题描述】:

这是我的 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(错误请求)状态。我很惊讶 .doc 会起作用,而 .xls 和 .vsd 会失败。

它也是一致的。我已经成功上传了几个 .doc 文件,没有任何失败。我还尝试上传几个 .xls 文件 - 有些成功,有些失败(成功始终一致,失败始终一致)。当我写这篇文章并测试越来越多的文件时,有一个 .pdf 文件始终会产生 504(提琴手 - 接收失败)错误。

仅供参考,我在客户端使用 Flex 并使用 FileReference 类进行上传。 Flex 代码与它们一样标准 - 使用此代码,唯一的变化是 WCF REST URL:http://blog.flexexamples.com/2007/09/21/uploading-files-in-flex-using-the-filereference-class/

任何想法为什么我看到一些失败和一些成功?我看不出两者有什么区别?

提前致谢。

【问题讨论】:

  • 我的第一个想法是您为这些文件发回的错误标头,但如果没有更多信息则无法确定。
  • @J_A_X,我不确定我是否跟随。由于我使用的是 FileReference,如何控制标头?我在哪里可以获取/设置这些信息?
  • 哦等等,上传。显示 Flex 代码。
  • @J_A_X,与此处完全相同,唯一的变化是指向 Web 服务的 FILE_UPLOAD_URL 变量:blog.flexexamples.com/wp-content/uploads/…

标签: wcf apache-flex actionscript-3 rest filereference


【解决方案1】:

您可以检查成功的文件的大小并在 web.config 中调整 webHttpBinding 的 maxReceivedMessageSize。默认只有 64KB。我遇到了类似的问题,直到我把它提高了(这里乘以 1000)。还将 requestValidationMode 设置为 2.0 并将 pages.validateRequest 设置为 false 以防止阻止“危险”上传。

这些更改对我有用,但我遇到了超过大约 4MB 的文件(不管 maxReceivedMessageSize 设置如何);修复需要增加 httpRuntime 的 maxRequestLength。

我将 transferMode 设置为 StreamedRequest,但不确定以这种方式上传文件对 IIS 性能和/或拒绝服务攻击有何影响。我认为使用 Streaming 模式应该是相当安全的。这是关于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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    相关资源
    最近更新 更多