我整天都遇到过这个问题,而且我为什么会这么做而迷失了。
我在React JS组件中从客户端发布文件(.xls文件),以响应点击这样的按钮:
upload: function (e) {
e.preventDefault();
var model = this.state.model;
var xlsFile = this.refs.xlsFile.getDOMNode();
var file = xlsFile.files[0];
var fd = new FormData();
fd.append('file', file);
var request = {
groupId: this.state.vkNumber,
payload: fd
};
model.importRequest = request;
model.setImportProcessing();
MultiOrderActions.updateUsers(request);
this.setState(model.toState());
}
Chrome中显示的请求(POST请求):
接受: / Accept-Encoding:gzip,deflate 接受语言:EN-US,EN; Q = 0.8,哒; Q = 0.6 连接:保持活跃 内容长度:3799243 内容类型:多部分/格式的数据;边界= ---- WebKitFormBoundaryBVYYdSXRza1yRuW4
请求的有效负载:
------ WebKitFormBoundaryBVYYdSXRza1yRuW4 内容处理:表格数据;命名="文件&#34 ;;文件名=" bruger_caas.xls" Content-Type:application / vnd.ms-excel
------ WebKitFormBoundaryBVYYdSXRza1yRuW4 -
请求中是否有任何二进制数据?内容长度是正确的,内容类型和文件名也是正确的。
在WebAPI中,我正在执行以下操作,ReadAsMultiPartAsync永远不会返回:
[HttpPost]
[Route("bc/s/{*url}")]
public async Task<IHttpActionResult> Post(string url)
{
var service = CreateClient<GenericService>();
if (Request.Content.IsMimeMultipartContent())
{
try
{
var provider = new MultipartMemoryStreamProvider();
await Request.Content.ReadAsMultipartAsync(provider);
foreach (var content in provider.Contents)
{
//Do stuff
;
}
}
catch (Exception e)
{
;
}
}
return InternalServerError();
}
当它到达await关键字时,它就会死掉,并在2分钟后超时,因为Chrome取消了请求。
我在这里做错了什么?我真的不确定问题是文件是否真的从客户端发送过,或者是否是我服务器端代码的问题。
非常感谢任何意见。
答案 0 :(得分:0)
对于那些谷歌搜索... 我还在排除文件上传的超时故障。 在我的例子中,当使用MultipartMemoryStreamProvider和ReadAsMultipartAsync
时,我得到一个死锁的线程最后这篇文章为我提供了一个解决方案:
Request.Content.ReadAsMultipartAsync never returns
使用&#34; TaskCreationOptions.LongRunning&#34;确保一个独特的线程,防止死锁。该问题的评论有一个有用的解释。