apache flex - WCF REST上传文件(一些文件成功- 200,一些失败- 400错误请求)



这是我的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 (Fiddler - Receive Failure)错误。

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

知道为什么我看到一些失败和一些成功吗?我看不出两者有什么区别吗?

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

这些变化得到的东西为我工作,但我遇到了麻烦的文件超过4MB(不管maxReceivedMessageSize设置);修复需要增加httpRuntime的maxRequestLength的问题。

我将transferMode设置为StreamedRequest,但我不确定以这种方式上传文件对IIS性能和/或拒绝服务攻击有什么影响。我认为它应该是相当安全的流模式。这里有一篇关于大数据和流媒体的文章。我以前使用分块客户端来避免像这样的大请求。

<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>

相关内容

  • 没有找到相关文章

最新更新