【问题标题】:windows mobile 6.5 .net CF HttpWebRequest to same URL from 2 different threads - errorswindows mobile 6.5 .net CF HttpWebRequest 从 2 个不同的线程到相同的 URL - 错误
【发布时间】:2011-02-18 11:34:51
【问题描述】:

我的 .NET CF 3.5 Windows Mobile 6.5 应用程序有一个奇怪的情况。 我有 2 个线程。

在第一个线程中,我执行以下操作:

try
{
  String url = "http://myserverurl";
  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
  _currentRequest = request;
  request.Timeout = 10000;

  response = (HttpWebResponse)request.GetResponse();
  ConnectionStatus connStatus = response.StatusCode == HttpStatusCode.OK;
  response.Close();
}
catch (Exception e)
{ 
  //log e
}
finally
{

}

在 2n 线程中,通过 WebService 引用生成的基于 SoapHttpClientProtocol 的类调用 WebService。

soapClient.Url = "http://myserverurl";
soapClient.MethodOnWebService();

在这两种情况下,网址都是相同的。第一个线程用于连接检查目的。它定期执行 WebRequest 以检查服务器是否可用并显示连接状态(代码中未显示)。第二个线程在同一服务器(url)上调用 WebService。我观察到,当一个线程正在执行 WebRequest 时,第二个线程在执行 Web 方法时被阻塞或事件超时。他们看起来都互相干扰。为什么?我想知道如果 Windows 移动网络堆栈意识到两个线程都转到同一个目标 IP:端口,它是否只是为两个线程创建一个套接字连接?会话呢?在桌面 Windows 上,我希望在客户端计算机上创建 2 个会话和至少 2 个套接字。 有人对 Windows Mobile(或 .NET CF)如何管理连接和套接字重用有任何提示吗?

问候

【问题讨论】:

    标签: c# .net soap windows-mobile compact-framework


    【解决方案1】:

    我猜想在某个地方会有第三次会议。您所看到的很可能是由于 HTTP 协议中的一个鲜为人知的(直到它咬到你,就像现在一样)推荐的连接限制。 RFC2068 的 8.1.4 部分说 “单用户客户端应该与任何服务器或代理保持最多 2 个连接”。我自己也遇到过同样的限制,最近一次是在 Windows Phone 7 上。

    限制在WebRequest,解决方法是增加限制:

    // set connection limit to 5
    ServicePointManger.DefaultConnectionLimit = 5;
    

    参见例如这个旧的 blog entry 来自 David Kline。

    【讨论】:

    • 谢谢。这就是问题所在。除了我当然可以增加连接限制这一事实之外,我还采用了我重组应用程序并将连接检查和 Web 服务连接的东西放在一个线程中的方式。谢谢!
    猜你喜欢
    • 2011-03-13
    • 2015-07-03
    • 2013-04-20
    • 2010-10-20
    • 2011-05-21
    • 2012-11-09
    • 1970-01-01
    • 2017-12-18
    • 1970-01-01
    相关资源
    最近更新 更多