我正在尝试将文件发送到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对此非常感激。
答案 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();