![](/img/trans.png)
[英]HTTPClient.PostAsync throws exception only when posting larger file
[英]WebAPI using PostAsync throws exception only when filesize is large
我正在尝试将文件发送到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'
它甚至没有达到服务控制器开始处的断点,因此我没有包含该代码(尽管如果那可能是一个问题,我可以这样做)。 就像我在上面说的那样,这仅在文件大于2mb时发生-小文件可以正常工作(感谢上帝,所以我有一些要演示的东西^^)。
任何帮助,将不胜感激。
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;
}
}
响应以text/html
Content-Type返回,并且ReadAsAsync<object>()
不知道如何将text/html
反序列化为object
。
您的网络应用可能已配置为仅接受最大大小的文件,并通过友好的HTML消息返回错误。 在尝试反序列化内容之前,您应该检查响应代码:
var response = await client.PostAsync(address, content);
response.EnsureSuccessStatusCode();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.