c# HTTP PUT请求代码的问题

本文关键字:问题 代码 请求 HTTP PUT | 更新日期: 2023-09-27 18:06:32

我正在尝试通过Amazon S3已经为我生成的PUT请求URL向S3发送文件。

我的代码对于小文件工作得很好,但是对于大文件(>100 mb)在发送几分钟后就会出错。

There error is: The request was aborted:请求被取消。在System.Net.ConnectStream。InternalWrite(布尔异步,Byte[]缓冲区,Int32偏移,Int32大小,AsyncCallback回调,对象状态)在System.Net.ConnectStream。写入(Byte[] buffer, Int32偏移量,Int32大小)

有人能告诉我我的代码有什么问题,阻止它发送大文件?这不是由于Amazon PUT请求URL过期,因为我将其设置为30分钟,并且在发送几分钟后发生问题。

代码最终在这行代码上异常:dataStream.Write(byteArray, 0, byteArray.Length);

同样,对于我发送到S3的较小文件,它工作得很好。只是不要大文件。

WebRequest request = WebRequest.Create(PUT_URL_FINAL[0]);
//PUT_URL_FINAL IS THE PRE-SIGNED AMAZON S3 URL THAT I AM SENDING THE FILE TO
request.Timeout = 360000; //6 minutes
request.Method = "PUT";
//result3 is the filename that I am sending                                     
request.ContentType =
    MimeType(GlobalClass.AppDir + Path.DirectorySeparatorChar + "unzip" +
             Path.DirectorySeparatorChar +
             System.Web.HttpUtility.UrlEncode(result3));
byte[] byteArray =
    File.ReadAllBytes(
        GlobalClass.AppDir + Path.DirectorySeparatorChar + "unzip" +
        Path.DirectorySeparatorChar +
        System.Web.HttpUtility.UrlEncode(result3));
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
// this is the line of code that it eventually quits on.  
// Works fine for small files, not for large ones
dataStream.Write(byteArray, 0, byteArray.Length); 
dataStream.Close();
//This will return "OK" if successful.
WebResponse response = request.GetResponse();
Console.WriteLine("++ HttpWebResponse: " +
                  ((HttpWebResponse)response).StatusDescription);

c# HTTP PUT请求代码的问题

您应该将WebRequestTimeout属性设置为更高的值。它导致请求在完成之前超时。

使用Fiddler或Wireshark来比较当它工作时(第三方工具)和当它不工作时(您的代码)…一旦你知道了差异,你就可以相应地修改你的代码…

我会尝试将其写入块并拆分字节数组。它可能被一个大块卡住了。

像这样:

        const int chunkSize = 500;
        for (int i = 0; i < byteArray.Length; i += chunkSize)
        {
            int count = i + chunkSize > byteArray.Length ? byteArray.Length - i : chunkSize;
            dataStream.Write(byteArray, i, count);
        }

可能需要再次检查以确保它写了所有内容,我只对它做了非常基本的测试。

只是一个粗略的猜测,但你不应该:

request.ContentLength = byteArray.LongLength;

代替:

request.ContentLength = byteArray.Length;

仔细想想,100 MB = 100 * 1024 * 1024 <2^32,所以这可能不是问题