gpt4 book ai didi

asp.net - 使用ASP.Net Web API的多部分表单POST

转载 作者:行者123 更新时间:2023-12-03 21:41:09 27 4
gpt4 key购买 nike

我有一个从A guide to asynchronous file uploads in ASP.NET Web API RTM改编的POST ASP.Net Web Api方法。

在第一个请求被触发并完成后,所有请求均被触发,我遇到了错误的任务问题。

情况如下:我有一个示例页面,该页面将文件以及其他参数发布到Web API Post方法。第一次运行正常,文件已上传。但是,所有后续请求最终都会使任务处于故障状态。我收到“MIME多部分流的意外结尾。 MIME分段消息不完整。”有什么想法吗?

下面粘贴的是我的Post方法,示例html表单和Aggregate Exception的源代码。

    public Task<HttpResponseMessage> Post([FromUri]string memberNumber)
{
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}

string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);

// Read the form data and return an async task.
var task = Request.Content.ReadAsMultipartAsync(provider).
ContinueWith(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.InternalServerError, t.Exception));
}

return Request.CreateResponse(HttpStatusCode.OK, new MyModel());
});

return task;
}

我使用这样的示例表单来触发此Web api:
<form name="form1" method="post" enctype="multipart/form-data" action="api/claims/asd123" style="margin:auto;width:500px;">
<div>
<label for="HCPracticeNumber">HC Pratice Number:</label>
<input type="text" name="HCPracticeNumber" id="HCPracticeNumber"/>
</div>
<div>
<label for="ServiceDate">Service/Treatment date:</label>
<input type="text" name="ServiceDate" id="ServiceDate"/>
</div>
<div>
<label for="AmountClaimed">Amount Claimed:</label>
<input type="text" name="AmountClaimed" id="AmountClaimed"/>
</div>
<div>
<label for="Image">Image Attachment:</label>
<input name="Image" type="file" />
</div>
<div>
<input type="submit" value="Submit" />
</div>
</form>

返回的AggregateException如下:
<Error>
<Message>An error has occurred.</Message>
<ExceptionMessage>One or more errors occurred.</ExceptionMessage>
<ExceptionType>System.AggregateException</ExceptionType>
<StackTrace/>
<InnerException>
<Message>An error has occurred.</Message>
<ExceptionMessage>
Unexpected end of MIME multipart stream. MIME multipart message is not complete.
</ExceptionMessage>
<ExceptionType>System.IO.IOException</ExceptionType>
<StackTrace>
at System.Net.Http.Formatting.Parsers.MimeMultipartBodyPartParser.<ParseBuffer>d__0.MoveNext() at System.Net.Http.HttpContentMultipartExtensions.MoveNextPart(MultipartAsyncContext context)
</StackTrace>
</InnerException>
</Error>

更新:

在Filip在他的博客网站上提出建议之后,我修改了post方法,将流位置重置为0,如下所示:
        Stream reqStream = Request.Content.ReadAsStreamAsync().Result;
if (reqStream.CanSeek)
{
reqStream.Position = 0;
}
var task = Request.Content.ReadAsMultipartAsync(provider).
ContinueWith(t =>
{
if (t.IsFaulted || t.IsCanceled)
{
throw new HttpResponseException(
Request.CreateErrorResponse(HttpStatusCode.InternalServerError,
t.Exception));
}

return Request.CreateResponse(HttpStatusCode.OK, new MyModel());

});

但是,这是非常气质的代码。有时,它有时不起作用。换句话说,它不能完全解决问题。

最佳答案

就像Filip在评论中所建议的那样,事实证明,我从Implementing Message Handlers To Track Your ASP .net Web API Usage改编的Web API使用处理程序正在读取内容主体,因此当在我的POST方法中处理请求时,流中的位置搜索器变得困惑。

因此,如果请求的类型为IsMimeMultipartContent,我向WebApiUsageHandler添加了条件语句以不读取请求主体。这解决了问题。

更新

我想用Filip通过电子邮件向我建议的另一个选项来更新答案,以便将其记录在案:

如果您在API用法处理程序中使用此代码,则在阅读正文之前:

   //read content into a buffer
request.Content.LoadIntoBufferAsync().Wait();

request.Content.ReadAsStringAsync().ContinueWith(t =>
{
apiRequest.Content = t.Result;
_repo.Add(apiRequest);
});

该请求将被缓冲,并且有可能被读取两次,因此可以在管道的更下方进行上载。
希望这可以帮助。

关于asp.net - 使用ASP.Net Web API的多部分表单POST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12384544/

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