【问题标题】:When internetconnection is slow: WebException - The remote server returned an error: NotFound网络连接慢时:WebException - 远程服务器返回错误:NotFound
【发布时间】:2013-07-16 22:29:21
【问题描述】:

我在我的应用中使用 2 个 WebClients,用于 2 个不同的天气 API。

当我的互联网连接速度很慢时,我从其中一个 API 中得到一个异常。它返回一个 404 Notfound 错误。

我已经通过禁用 WiFi 进行了测试,并将数据连接设置为“2G”。第一个 API 毫无问题地返回数据,但是第二个 API 使我的应用程序因 WebException 而崩溃。

当我再次打开 WiFi 时,它可以完美运行。看起来第二个 API 对慢速连接没有耐心。

有没有办法解决这个问题?我也试过把 WebClient 改成 HttpWebRequest 但问题还是出现了。

亲切的问候, 尼尔斯

编辑 我的代码:

    private void GettingTheData()
    {
         WebClient Client = new WebClient();
         Client.DownloadStringCompleted += new DownloadStringCompletedEventHandler(Client _DownloadStringCompleted);

         Client.DownloadStringAsync(new Uri("http://theURI.com"));
    }

void Client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
   {

    string result = e.Result.ToString();
    // Let's do the cool stuff overhere
}

【问题讨论】:

  • 您能否发布您用于客户端/网络请求的代码
  • 不是一个解决方案,但您确定您确实从手机获得了有效的连接吗?我发现建立 2G 连接可能需要很长时间。我总是通过在移动 IE 中浏览已知网站来进行交叉检查。你真的应该处理WebException,顺便说一下这种情况。
  • 是的,我确实有一个有效的连接,因为其他 Weather API 确实可以工作.. 慢,但它可以工作。看起来,当连接速度很慢时,API 的服务器无法正常工作,只是断开了连接。这导致了 WebException。我在第一篇文章中添加了我的代码。
  • 老兄,你不会从慢速连接中得到 404。 404 表示请求已发送到 Web 服务器,而 Web 服务器表示未找到该文件。你能捕捉到完整的响应和请求吗?更有可能您正在访问其他机器,而不是使用 Web 服务的机器。
  • @Niels,HttpWebRequest.Timeout 属性绝对可以解决您的问题......但它在 Windows 手机上不存在。你可以试试this,也许会奏效。

标签: c# performance windows-phone-7 windows-phone-8


【解决方案1】:

WP 存在HTTP Client library,其中包含对超时的支持。 Article 关于它。

一些适用于 Windows Phone 8 的示例代码:

protected async override void OnNavigatedTo(NavigationEventArgs e)
{
     var httpClient = new HttpClient {Timeout = TimeSpan.FromSeconds(30)};
     var responseBodyAsText = await httpClient.GetStringAsync("www.contoso.com");
}

【讨论】:

  • 您能提供网址吗?因为没有这些调试是不可能的
  • gps.buienradar.nl/getrr.php?lat=52&lon=4 这是在 2G 上并不总是有效的 URI
  • 其实我做了一些重新测试。当 TimeSpan.FromSeconds 设置为 1 秒时,我会收到现有的错误消息,但是当它设置为 30 时,它似乎确实可以正常工作:)。我必须做一些 BETA 和现实世界的测试,但我想切换到这个并没有任何真正的缺点。谢谢!
  • 完全支持使用 HTTP 客户端库,并且大多数支持可移植类库的库已经完全使用它
  • 我做了一些真实世界的测试,不幸的是我仍然得到错误:在 mscorlib.ni.dll 中发生了“System.Net.Http.HttpRequestException”类型的异常,并且在托管之前未处理/native 边界 System.Collections.ListDictionaryInternal 响应状态码不表示成功:404()。在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
【解决方案2】:

也许问题不在于网络延迟。也许您的第二个 API 要求调用者发送用户代理字符串,或您未发送的其他一些 HTTP 标头。它通过 WiFi 而不是 2G 工作的事实可能与从 WiFi 网络连接的任何设备似乎与托管 API 的服务器相同(从 IP 地址的角度来看)并且可能允许基于访问的事实有关在一些缓存的身份上(也许您浏览了该服务以从您的开发 PC 上对其进行测试)。如果响应相似,我很想看看如果您连接到不同的 WiFi 网络会发生什么。

我的直接建议是捕获 WebException 并让用户有机会重试。

我会将此添加为评论,但我想我没有足够的声誉。

【讨论】:

  • 感谢您的建议。它在 3G、多个设备和许多不同的 wifi 网络上运行良好。此外,文档(非常有限)也没有提及任何额外的字符串/HTTP 标头。只有“2G”部分很奇怪。有时有效,有时无效。
【解决方案3】:

尝试增加ServicePointManager.DefaultConnectionLimit,尽管默认值为 2。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多