File upload HttpClient会导致可预测的异常

File upload HttpClient会导致可预测的异常,file-upload,asp.net-web-api,httpclient,File Upload,Asp.net Web Api,Httpclient,我正在使用.NET4.0来尝试利用HttpClient提供的功能。其目的是使用HTTP动词“PUT”将大小约为10.5MB的特定文件上载到远程服务器。远程服务器使用node.js 我已经编写了一个小型控制台应用程序(.NET 4.0完整版而非客户端配置文件) 我正在使用的笔记本电脑没有.NET 4.5或Visual Studio 2012 我安装了这些NuGet软件包,以支持带有进度更新的异步上载功能 <packages> <package id="Microsoft.As

我正在使用.NET4.0来尝试利用HttpClient提供的功能。其目的是使用HTTP动词“PUT”将大小约为10.5MB的特定文件上载到远程服务器。远程服务器使用node.js

我已经编写了一个小型控制台应用程序(.NET 4.0完整版而非客户端配置文件)
我正在使用的笔记本电脑没有.NET 4.5或Visual Studio 2012
我安装了这些NuGet软件包,以支持带有进度更新的异步上载功能

<packages>
  <package id="Microsoft.AspNet.WebApi.Client" version="4.0.20710.0" targetFramework="net40" />
  <package id="Microsoft.Net.Http" version="2.0.20710.0" targetFramework="net40-Client" />
  <package id="Newtonsoft.Json" version="4.5.11" targetFramework="net40" />
</packages>
适用于各种其他类型。然而,第二个例外总是可以预测的,并且是相同的。这是

ObjectDisposedExceptoin
Cannot access a disposed object.
Object name: 'System.Net.Sockets.NetworkStream'.
最后,这是链中的最后一个例外

IOException

    Unable to read data from the transport connection: Cannot access a disposed object.
    Object name: 'System.Net.Sockets.Socket'..
正如您所注意到的,我已经从代码中删除了所有的using块、close或dispose语句等。为了我的生命,我不知道哪里出了问题!我已经在HttpClient上尝试了PutAsync和SendAsnyc方法。它们唯一的区别是第一个例外发生了变化

这是代码块

void UploadFile(string fileToUpload)
        {
            //string fileToUpload = @"F:\\upload_file.txt";
            using (FileStream rdr = new FileStream(fileToUpload, FileMode.Open))
            {
                HttpWebRequest req = null;
                Stream reqStream = null;
                try
                {
                    req = (HttpWebRequest)WebRequest.Create(url);

                    req.Method = "PUT";
                    req.Headers.Add("x-myheader", "163333.zip");
                    req.ContentType = "application/octet-stream";
                    req.ContentLength = rdr.Length;
                    req.AllowWriteStreamBuffering = false;
                    req.Timeout = 1000000;
                    reqStream = req.GetRequestStream();
                    Console.WriteLine(rdr.Length);
                    byte[] inData = new byte[rdr.Length];

                    // Get data from upload file to inData 
                    int bytesRead = rdr.Read(inData, 0, (int)rdr.Length);

                    // put data into request stream
                    reqStream.Write(inData, 0, (int)rdr.Length);
                    rdr.Close();

                    req.GetResponse();
                    // after uploading close stream 
                    reqStream.Close();

                }
                catch (Exception e)
                {

                }
                finally
                {
                    rdr.Close();

                    req.GetResponse();
                    // after uploading close stream 
                    reqStream.Close();

                }
            }


        }



        void UploadFileAsync(string fileToUpload)
        {


            //string fileToUpload = @"F:\\upload_file.txt";
            FileStream rdr = new FileStream(fileToUpload, FileMode.Open, FileAccess.Read, FileShare.Read, 8192, true);
            //newfs rdr = new newfs(fileToUpload, FileMode.Open);
            HttpClientHandler clientHandler = new HttpClientHandler();
            ProgressMessageHandler progressHandler = new ProgressMessageHandler(clientHandler);
            HttpClient client = new HttpClient(progressHandler);

            try
            {


                client.DefaultRequestHeaders.Add("x-myheader", "163333.zip");

                HttpRequestMessage requestPayLoad = new HttpRequestMessage(HttpMethod.Put, url);

                long totalFileSize = rdr.Length;
                Console.WriteLine(totalFileSize);

                int? previousPercentage = null;

                progressHandler.HttpSendProgress += (sender, args) =>
                {
                    if (!previousPercentage.HasValue || previousPercentage != args.ProgressPercentage)
                        Console.WriteLine(args.ProgressPercentage);
                    previousPercentage = args.ProgressPercentage;

                };

                requestPayLoad.Content = new StreamContent(rdr);

                //requestPayLoad.Content = new FileContent(fileToUpload);
                //var task = client.PutAsync<byte[]>(url, rdr, new BinaryMediaTypeFormatter());
                var task = client.SendAsync(requestPayLoad);
                task.Wait();


            }
            catch (Exception e)
            {

            }
            finally
            {
                //rdr.Close();
                client.Dispose();
                //req.GetResponse();
                //// after uploading close stream 
                //reqStream.Close();

            }

        }
void上传文件(string fileToUpload)
{
//字符串fileToUpload=@“F:\\upload\u file.txt”;
使用(FileStream rdr=newfilestream(fileToUpload,FileMode.Open))
{
HttpWebRequest req=null;
Stream reqStream=null;
尝试
{
req=(HttpWebRequest)WebRequest.Create(url);
req.Method=“PUT”;
请求标题添加(“x-myheader”、“1633333.zip”);
req.ContentType=“应用程序/八位字节流”;
req.ContentLength=rdr.Length;
req.AllowWriteStreamBuffering=false;
请求超时=1000000;
reqStream=req.GetRequestStream();
控制台写入线(rdr长度);
byte[]inData=新字节[rdr.Length];
//从上传文件获取数据到inData
int bytesRead=rdr.Read(inData,0,(int)rdr.Length);
//将数据放入请求流
请求流写入(inData,0,(int)rdr.Length);
rdr.Close();
req.GetResponse();
//上传后关闭流
reqStream.Close();
}
捕获(例外e)
{
}
最后
{
rdr.Close();
req.GetResponse();
//上传后关闭流
reqStream.Close();
}
}
}
void UploadFileAsync(字符串fileToUpload)
{
//字符串fileToUpload=@“F:\\upload\u file.txt”;
FileStream rdr=newfilestream(fileToUpload,FileMode.Open,FileAccess.Read,FileShare.Read,8192,true);
//newfs rdr=newfs(fileToUpload,FileMode.Open);
HttpClientHandler clientHandler=新的HttpClientHandler();
ProgressMessageHandler progressHandler=新的ProgressMessageHandler(clientHandler);
HttpClient客户端=新的HttpClient(progressHandler);
尝试
{
client.DefaultRequestHeaders.Add(“x-myheader”,“1633333.zip”);
HttpRequestMessage requestPayLoad=新的HttpRequestMessage(HttpMethod.Put,url);
long totalFileSize=rdr.Length;
Console.WriteLine(totalFileSize);
int?上一个百分比=null;
progressHandler.HttpSendProgress+=(发送方,参数)=>
{
如果(!previousPercentage.HasValue | | previousPercentage!=args.ProgressPercentage)
控制台写入线(参数百分比);
previousPercentage=args.ProgressPercentage;
};
requestPayLoad.Content=新的StreamContent(rdr);
//requestPayLoad.Content=新文件内容(fileToUpload);
//var task=client.PutAsync(url、rdr、新的BinaryMediaTypeFormatter());
var task=client.sendaync(requestPayLoad);
task.Wait();
}
捕获(例外e)
{
}
最后
{
//rdr.Close();
client.Dispose();
//req.GetResponse();
////上传后关闭流
//reqStream.Close();
}
}
更新


看起来文件确实到达了服务器,正常。这基本上意味着ProgressHandler报告的百分比不正确,错误出现在上传的最右端。Fiddler显示HTTP 200状态代码

尝试检查HttpClientHandler的MaxRequestContentBufferSize属性,如果它太小,请放大它。谢谢Vladmir,我将在周一尝试。但是看看MSDN,默认值是2GB,我上传的文件只有10MB,所以我不太确定这是否有用。但会给它一个也不起作用的goNo。我绞尽脑汁想弄明白这个问题。
void UploadFile(string fileToUpload)
        {
            //string fileToUpload = @"F:\\upload_file.txt";
            using (FileStream rdr = new FileStream(fileToUpload, FileMode.Open))
            {
                HttpWebRequest req = null;
                Stream reqStream = null;
                try
                {
                    req = (HttpWebRequest)WebRequest.Create(url);

                    req.Method = "PUT";
                    req.Headers.Add("x-myheader", "163333.zip");
                    req.ContentType = "application/octet-stream";
                    req.ContentLength = rdr.Length;
                    req.AllowWriteStreamBuffering = false;
                    req.Timeout = 1000000;
                    reqStream = req.GetRequestStream();
                    Console.WriteLine(rdr.Length);
                    byte[] inData = new byte[rdr.Length];

                    // Get data from upload file to inData 
                    int bytesRead = rdr.Read(inData, 0, (int)rdr.Length);

                    // put data into request stream
                    reqStream.Write(inData, 0, (int)rdr.Length);
                    rdr.Close();

                    req.GetResponse();
                    // after uploading close stream 
                    reqStream.Close();

                }
                catch (Exception e)
                {

                }
                finally
                {
                    rdr.Close();

                    req.GetResponse();
                    // after uploading close stream 
                    reqStream.Close();

                }
            }


        }



        void UploadFileAsync(string fileToUpload)
        {


            //string fileToUpload = @"F:\\upload_file.txt";
            FileStream rdr = new FileStream(fileToUpload, FileMode.Open, FileAccess.Read, FileShare.Read, 8192, true);
            //newfs rdr = new newfs(fileToUpload, FileMode.Open);
            HttpClientHandler clientHandler = new HttpClientHandler();
            ProgressMessageHandler progressHandler = new ProgressMessageHandler(clientHandler);
            HttpClient client = new HttpClient(progressHandler);

            try
            {


                client.DefaultRequestHeaders.Add("x-myheader", "163333.zip");

                HttpRequestMessage requestPayLoad = new HttpRequestMessage(HttpMethod.Put, url);

                long totalFileSize = rdr.Length;
                Console.WriteLine(totalFileSize);

                int? previousPercentage = null;

                progressHandler.HttpSendProgress += (sender, args) =>
                {
                    if (!previousPercentage.HasValue || previousPercentage != args.ProgressPercentage)
                        Console.WriteLine(args.ProgressPercentage);
                    previousPercentage = args.ProgressPercentage;

                };

                requestPayLoad.Content = new StreamContent(rdr);

                //requestPayLoad.Content = new FileContent(fileToUpload);
                //var task = client.PutAsync<byte[]>(url, rdr, new BinaryMediaTypeFormatter());
                var task = client.SendAsync(requestPayLoad);
                task.Wait();


            }
            catch (Exception e)
            {

            }
            finally
            {
                //rdr.Close();
                client.Dispose();
                //req.GetResponse();
                //// after uploading close stream 
                //reqStream.Close();

            }

        }