gpt4 book ai didi

c# - WebAPI 错误读取 MIME 多部分正文部分

转载 作者:太空狗 更新时间:2023-10-30 00:01:18 25 4
gpt4 key购买 nike

我的团队最近重构了一个 Web API 服务,将一些重复代码移到静态方法中。一种方法与从请求中提取上传的文件有关。该方法适用于单元测试,但在负载下会抛出异常。部分代码是在 SO 帖子中找到的,但我担心,总的来说,我们没有正确使用它。这是代码:

internal static string ExtractFile(HttpRequestMessage request)
{
if (request.Content.IsMimeMultipartContent())
{
string uploadRoot = ServiceHelper.GetUploadDirectoryPath();

var provider = new MultipartFormDataStreamProvider(uploadRoot);

try
{
Task.Factory
.StartNew(() => provider = request.Content.ReadAsMultipartAsync(provider).Result,
CancellationToken.None,
TaskCreationOptions.LongRunning, // guarantees separate thread
TaskScheduler.Default)
.Wait();
}
catch(System.AggregateException ae)
{
if(log.IsErrorEnabled)
{
foreach(var ex in ae.InnerExceptions)
{
log.Error("ReadAsMultipartAsync task error.", ex);
}
}

var errorResponse = request.CreateErrorResponse(HttpStatusCode.InternalServerError, "An error occurred while extracting the uploaded file from the request.");
throw new HttpResponseException(errorResponse);
}

var fileData = provider.FileData.First();

var localName = fileData.LocalFileName;
var content = File.ReadAllText(localName);

if (log.IsDebugEnabled)
{
var embeddedName = fileData.Headers.ContentDisposition.FileName;
log.DebugFormat("File {0} was successfully uploaded as '{1}'.", embeddedName, localName);
}

return content;
}
else
{
log.Error("Invalid request received. Request must be in a multipart/form-data request.");

var errorResponse = request.CreateErrorResponse(HttpStatusCode.InternalServerError, "Request must be a multipart/form-data request and contain one file.");
throw new HttpResponseException(errorResponse);
}
}

遍历日志,我看到如下错误:

System.IO.IOException:读取 MIME 多部分正文部分时出错。 ---> System.IO.IOException ---> System.Net.HttpListenerException:由于线程退出或应用程序请求,I/O 操作已中止

处理 HttpListenerRequest

System.IO.IOException:读取 MIME 多部分正文部分时出错。 ---> System.IO.IOException ---> System.Net.HttpListenerException: 尝试在不存在的网络连接上进行操作

此 Web 服务作为自托管的 OWIN Windows 服务运行。文件上传很小(3k 到 4k)。

我无法通过一次上传重现该问题。与服务对话的客户端使用任务来发布文件,但它通常不会同时运行超过 4 或 5 个任务。我和我的团队对 .NET 任务还比较陌生。其中一位开发人员想知道 TaskCreationOptions.LongRunning 参数是否真的弊大于利。有什么建议吗?

更新:

我尝试用这个切换 Task.Factory 代码:

var task = Task.Run(async () => await request.Content.ReadAsMultipartAsync(provider));
task.Wait();
provider = task.Result;

我仍然遇到一些问题,但这似乎效果更好。不过不知道为什么。

最佳答案

我遇到了同样的问题,通过在 web.config 中添加以下代码解决了这个问题

<system.web>
<httpRuntime maxRequestLength="30000000" />
</system.web>

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

来源:http://stackoverflow.com/questions/20942636/webapi-cannot-parse-multipart-form-data-post

关于c# - WebAPI 错误读取 MIME 多部分正文部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39003967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com