Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在asp.net mv4 web api中读取多部分表单数据时处理已处理的对象错误_C#_Asp.net Mvc_Web Services - Fatal编程技术网

C# 在asp.net mv4 web api中读取多部分表单数据时处理已处理的对象错误

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() {

我的设置是一个使用.NET4.5和EntityFramework5的asp.NETMVC4项目。语言是C#

该代码主要是microsoft教程的直接副本,使用多种形式的数据处理post请求。发生的情况是,当我尝试访问文件的ContentLength时,它抛出System.ObjectDisposedException。完整的stacktrace位于代码段之后

    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中添加了什么吗?有人吗?我也遇到了…所以直到今天都没有答案?