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(错误请求)状态失败。我很惊讶 .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 -文件参考类/

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

提前致谢。

4

1 回答 1

2

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

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

我将 transferMode 设置为 StreamedRequest,但不确定以这种方式上传文件对 IIS 性能和/或拒绝服务攻击有何影响。我认为使用 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 回答