使用PostAsync的Web API仅在文件大小较大时才引发异常

时间:2014-01-15 23:19:00

标签: c# winforms rest asp.net-web-api

我正在尝试将文件发送到WebAPI控制器,该控制器使用服务器上的文件进行一些处理。一切似乎都运行良好,直到我尝试大于2mb的文件...大于此的文件似乎抛出一个奇怪的例外。

以下是摘录:

       var progress = new ProgressMessageHandler();
        progress.HttpSendProgress += ProgressEventHandler;
        HttpClient client = HttpClientFactory.Create(progress);
        client.Timeout = TimeSpan.FromMinutes(20);
try  
                {
                    using (
                        var fileStream = new FileStream(file, FileMode.Open,      FileAccess.Read, FileShare.Read, 1024,
                        useAsync: true))
                {
                    var content = new StreamContent(fileStream, 1024);
                    var address = new Uri(string.Format("{0}api/File/Upload?submittalId={1}&fileName={2}&documentTypeId={3}", FileServiceUri, tabTag.submittalId, Path.GetFileName(file), documentTypeId));
                    client.MaxResponseContentBufferSize = 2147483647;
                    var response = await client.PostAsync(address, content);
                    var result = response.Content.ReadAsAsync<object>();
                    if (!response.IsSuccessStatusCode)
                        continue;
                }

抛出异常:

var response = await client.PostAsync(address, content);

并且是:

No MediaTypeFormatter is available to read an object of type 'Object' from content with media type 'text/html'

它甚至没有在我的服务控制器的开头遇到断点,所以我没有包含该代码(尽管我可以,如果这可能是一个问题)。正如我上面所说,这只发生在文件&gt; 2mb - 小文件工作得很好(感谢上帝所以我有一些东西可以展示^^)。

Anyhelp对此非常感激。

2 个答案:

答案 0 :(得分:3)

Cory的观察是正确的,Web API没有内置格式化程序来序列化或反序列化text / html内容。我的猜测是你很可能在html中得到一个错误响应。如果确实如此,您可以执行以下操作:

将文件上载到IIS托管的Web API应用程序时,需要注意以下事项。

您需要在Web.config中查找以下2个设置以增加上传大小:

注意(maxRequestLength =“以千字节为单位的大小”)

<system.web> <httpRuntime targetFramework="4.5" maxQueryStringLength="" maxRequestLength="" maxUrlLength="" />

注意(maxAllowedContentLength以字节为单位)

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

另请注意,IIS托管方案中Web API的默认缓冲区策略为buffered,因此,如果要上载大文件,则您的请求将消耗大量内存。为了防止这种情况,您可以更改以下政策:

config.Services.Replace(typeof(IHostBufferPolicySelector), new CustomBufferPolicySelector());  

//---------------  

public class CustomBufferPolicySelector : WebHostBufferPolicySelector
{
    public override bool UseBufferedInputStream(object hostContext)
    {
        return false;
    }
}

答案 1 :(得分:1)

回复的回复是text/html内容类型,ReadAsAsync<object>()不知道如何将text/html反序列化为object

可能,您的网络应用程序配置为仅接受特定大小的文件,并返回带有友好HTML消息的错误。在尝试反序列化内容之前,您应该检查响应代码:

var response = await client.PostAsync(address, content);
response.EnsureSuccessStatusCode();