gpt4 book ai didi

c# - 使用 HttpWebRequest 通过 PUT 上传文件时出错

转载 作者:行者123 更新时间:2023-11-30 13:21:26 24 4
gpt4 key购买 nike

我们有一个 .NET 2.0 WinForms 应用程序需要通过 WebDav 将文件上传到 IIS6 服务器。我们不时收到来自远程办公室的投诉,他们收到以下错误消息之一

  • 基础连接已关闭:发送时发生意外错误。
  • 基础连接已关闭:发生意外错误接收。

这似乎只发生在大文件(~20Mb 以上)中。我已经用我家用电脑上的一个 40Mb 文件对其进行了测试,并尝试将“ sleep ”置于循环中以模拟慢速连接,因此我怀疑这最终归结为网络问题......但是

  1. 远程办公室的 IT 帮不上忙
  2. 我想排除我的代码出错的可能性。

那么 - 任何人都可以发现任何错误或提出任何可能“防弹”代码以解决此问题的解决方法。谢谢你的帮助。代码的简化版本如下:

    public bool UploadFile(string localFile, string uploadUrl)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(uploadUrl);

try
{
req.Method = "PUT";
req.AllowWriteStreamBuffering = true;
req.UseDefaultCredentials = Program.WebService.UseDefaultCredentials;
req.Credentials = Program.WebService.Credentials;
req.SendChunked = false;
req.KeepAlive = true;
Stream reqStream = req.GetRequestStream();
FileStream rdr = new FileStream(localFile, FileMode.Open, FileAccess.Read);
byte[] inData = new byte[4096];
int bytesRead = rdr.Read(inData, 0, inData.Length);

while (bytesRead > 0)
{
reqStream.Write(inData, 0, bytesRead);
bytesRead = rdr.Read(inData, 0, inData.Length);
}

reqStream.Close();
rdr.Close();

System.Net.HttpWebResponse response = (HttpWebResponse)req.GetResponse();
if (response.StatusCode != HttpStatusCode.OK && response.StatusCode!=HttpStatusCode.Created)
{
MessageBox.Show("Couldn't upload file");
return false;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
return false;
}
return true;
}

最佳答案

尝试设置 KeepAlive为假:

req.KeepAlive = false;

这将允许关闭并再次打开连接。它不允许使用 persistent connection .我在 Web 上发现了很多建议这样做的引用资料,以解决与您的错误类似的问题。这是一个相关的 link .

无论如何,使用HTTP PUT(或HTTP POST)上传大文件并不是一个好主意。最好使用 FTP 或下载/上传管理器。这些将自动为您处理重试、连接问题、超时。上传速度也会更快,您也可以恢复已停止的上传。如果您决定继续使用 HTTP,您至少应该尝试添加重试机制。如果上传时间过长,则很可能由于代理、服务器超时、防火墙或任何不包含您的代码的原因而导致上传失败。

关于c# - 使用 HttpWebRequest 通过 PUT 上传文件时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734404/

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