C# 在asp.net mv4 web api中读取多部分表单数据时处理已处理的对象错误
我的设置是一个使用.NET4.5和EntityFramework5的asp.NETMVC4项目。语言是C# 该代码主要是microsoft教程的直接副本,使用多种形式的数据处理post请求。发生的情况是,当我尝试访问文件的ContentLength时,它抛出System.ObjectDisposedException。完整的stacktrace位于代码段之后C# 在asp.net mv4 web api中读取多部分表单数据时处理已处理的对象错误,c#,asp.net-mvc,web-services,C#,Asp.net Mvc,Web Services,我的设置是一个使用.NET4.5和EntityFramework5的asp.NETMVC4项目。语言是C# 该代码主要是microsoft教程的直接副本,使用多种形式的数据处理post请求。发生的情况是,当我尝试访问文件的ContentLength时,它抛出System.ObjectDisposedException。完整的stacktrace位于代码段之后 public async Task<HttpResponseMessage> PostFormData() {
public async Task<HttpResponseMessage> PostFormData()
{
// 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);
try
{
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
// This illustrates how to get the file names.
foreach (MultipartFileData file in provider.FileData)
{
Debug.WriteLine(file.Headers.ContentDisposition.FileName);
Debug.WriteLine("Server file path: " + file.LocalFileName);
Debug.WriteLine("Content type: " + file.Headers.ContentType);
Debug.WriteLine("This wont work: " + file.Headers.ContentLength);
}
return Request.CreateResponse(HttpStatusCode.OK, "OK");
}
catch (System.Exception e)
{
return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, e);
}
}
public异步任务PostFormData()
{
//检查请求是否包含多部分/表单数据。
如果(!Request.Content.IsMimeMultipartContent())
{
抛出新的HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root=HttpContext.Current.Server.MapPath(“~/App_Data”);
var provider=新的MultipartFormDataStreamProvider(根);
尝试
{
//读取表单数据。
wait Request.Content.ReadAsMultipartAsync(提供程序);
//这说明了如何获取文件名。
foreach(provider.FileData中的MultipartFileData文件)
{
Debug.WriteLine(file.Headers.ContentDisposition.FileName);
Debug.WriteLine(“服务器文件路径:+file.LocalFileName”);
Debug.WriteLine(“内容类型:“+file.Headers.ContentType”);
WriteLine(“这不起作用:“+file.Headers.ContentLength”);
}
返回请求.CreateResponse(HttpStatusCode.OK,“OK”);
}
捕获(System.e例外)
{
返回请求.CreateErrorResponse(HttpStatusCode.InternalServerError,e);
}
}
堆栈跟踪:
System.Net.Http.dll中发生了类型为“System.ObjectDisposedException”的第一次意外异常
iisexpress.exe错误:0:Operation=ReflectedHttpActionDescriptor.ExecuteAsync,Exception=System.ObjectDisposedException:无法访问已处置的对象。
对象名称:“System.Net.Http.StringContent”。
在System.Net.Http.HttpContent.CheckDisposed()中
位于System.Net.Http.HttpContent.GetComputedOrBufferLength()处
在System.Net.Http.Headers.HttpContentHeaders.get_ContentLength()中
在c:\Users\matt.delves\blah\FieldAssistant\Controller\SpeedTestController.d_u0.MoveNext()中
iisexpress.exe错误:0:Operation=ApiControllerActionInvoker.InvokeActionAsync,Exception=System.ObjectDisposedException:无法访问已处置的对象。
对象名称:“System.Net.Http.StringContent”。
在System.Net.Http.HttpContent.CheckDisposed()中
位于System.Net.Http.HttpContent.GetComputedOrBufferLength()处
在System.Net.Http.Headers.HttpContentHeaders.get_ContentLength()中
在c:\Users\matt.delves\blah\FieldAssistant\Controller\SpeedTestController.d_u0.MoveNext()中
iisexpress.exe错误:0:Operation=SpeedTestController.ExecuteAsync,Exception=System.ObjectDisposedException:无法访问已处置的对象。
对象名称:“System.Net.Http.StringContent”。
在System.Net.Http.HttpContent.CheckDisposed()中
位于System.Net.Http.HttpContent.GetComputedOrBufferLength()处
在System.Net.Http.Headers.HttpContentHeaders.get_ContentLength()中
在c:\Users\matt.delves\blah\FieldAssistant\Controller\SpeedTestController.d_u0.MoveNext()中
iisexpress.exe信息:0:Message='将使用相同的'JsonMediaTypeFormatter'格式化程序',操作=JsonMediaTypeFormatter.GetPerRequestFormatterInstance
iisexpress.exe信息:0:Message='Selected formatter='JsonMediaTypeFormatter',content type='application/json;字符集=utf-8'',操作=DefaultContentCongregator.Congregate
iisexpress.exe信息:0:响应,状态=500(InternalServerError),方法=POST,Url=http://192.168.2.63:51230/api/speedtest,Message='Content-type='application/json;字符集=utf-8',内容长度=未知'
iisexpress.exe信息:0:Operation=JsonMediaTypeFormatter.WriteToStreamAsync
iisexpress.exe信息:0:操作=SpeedTestController.Dispose
程序“[4436]iisexpress.exe:Managed(v4.0.30319)”已退出,代码为0(0x0)。
有人建议用几行代码修改web.config来解决这个问题,但插入这些代码后,我发现它们不起作用
我基本上不是一个microsoft/c的家伙,因此如果能在回复中给出更多解释,我将不胜感激。我遇到了同样的问题,解决方法如下:
var fileSize = new FileInfo(file.LocalFileName).Length;
此代码添加到循环中,而不是
Debug.WriteLine("This wont work: " + file.Headers.ContentLength);
我也有同样的问题。。。你还记得你在web.config中添加了什么吗?有人吗?我也遇到了…所以直到今天都没有答案?