我正在尝试使用 System.Net.WebClient.UploadFile 将文件上传到 Web 服务器,但我不断收到 WebException。具体来说,我收到了 3 个错误。我不知道为什么我没有收到相同的错误,但根据我在网上找到的内容,它们似乎都是相关的。

  • 请求被中止:请求被取消。
  • 连接已关闭。再试一次。
  • 现有连接被远程主机强制关闭。

它看起来有点随机(并不总是相同的文件、时间量或我能弄清楚的任何其他模式)。另外,这不会发生在我的工作网络上(上传时间不到 2 秒),但确实会通过 DSL 在家中发生(上传时间大约为 2 分钟)。

根据我在网上找到的信息,这些错误与保活有关。不幸的是,WebClient 没有提供任何方法来关闭这些(我不确定我是否愿意这样做,因为这是一个性能功能)。

我认为这可能与超时有关,但我不明白为什么。服务器是ASP.Net MVC,超时设置为一个小时。

    <httpRuntime
        maxRequestLength="10024" 
        executionTimeout="3600"
        /><!-- 10024 = 10MB, 3600 = 1hr -->

我对解决此问题的两种方法以及恢复技术(简单地再次发出请求似乎并不有效)都很感兴趣。

一些背景知识,这是一个将照片上传到服务器的 WinForms 应用程序。服务器是 ASP.Net MVC 应用程序。客户端已经正常工作了很长一段时间,但自从我将其切换到 ASP.Net MVC(它使用带有 SA FileUp 的经典 ASP)后,现在出现故障。客户端仅进行更改以适应新的 URL,除此之外几乎相同。

有帮助吗?

解决方案

异常“请求被中止:请求已取消。”如果 WebClient 在文件传输期间超时,则会抛出该错误。如果没有进行文件传输,您将收到“操作已超时”。

客户端发生超时。WebClient 不允许您设置超时,HttpWebRequest(WebClient 使用的)的默认值为 100 秒。我想我必须弄清楚如何在使用 HttpWebRequest 时获取进度。我还必须弄清楚为什么 ASP.Net 文件传输比使用 SAFileUp 与经典 ASP 慢。

更新:我创建了一个 WebHelper 类,它取代了 WebClient,但提供了对底层 WebRequest 必要功能的更多访问。它还通过 WebClient 提供了一系列附加功能。如果您有兴趣,可以在 商方舟项目 在 CodePlex 上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top