背景
我有一个带有 2 个网络适配器的移动嵌入式设备 (Ubuntu/Mono)。一种是WiFi,另一种是GSM。要求是当WiFi适配器连接到互联网时(在预定AP的范围内),应用程序上传数据(HTTPS 发布)通过 WiFi,但当 WiFi 不可用但 GSM 可用时,它会通过 GSM 链路上传数据。
Testing
为了实现这一目标,我创建了一个基于云的 Web 服务,如果您向它发出 HTTP GET,该服务将返回 OK。这个想法是让一个线程定期发出绑定到特定适配器的 GET 请求并检查结果。 “正常”结果表示适配器已连接到互联网,而超时通常表示未连接到互联网。然后我可以使用它来确定使用哪个适配器来处理请求。
我创建了一个小型测试应用程序,它启动一个线程,发出绑定到特定适配器的 GET 请求。我使用 request.BindIPEndPointDelegate 将请求绑定到适配器。当我在 WiFi 适配器上运行该应用程序时,结果符合预期。当 WiFi AP 打开时,请求返回 OK,当 AP 关闭时,请求超时。当我在 GSM 适配器上运行应用程序时也是如此。
但是,当我更新应用程序以启动 2 个线程(一个用于 WiFi 适配器和 GSM 适配器)时,出现问题。当 AP 打开时,WiFi 和 GSM 请求会顺利进行。当我关闭 AP 时,WiFi 请求最初超时,但一段时间后返回成功结果,这是错误的。因为两个线程的 URI 相同,所以我怀疑 ServicePointManager 将相同的 ServicePoint 返回给两个线程,并且由于多线程,这会变得混乱。
下一个测试是创建 2 个不同的端点。 WiFi 和 GSM 请求各一个,希望 ServicePointManager 始终返回不同的 ServicePoint。不幸的是,这没有产生积极的影响。
我将不胜感激的建议。
代码如下:
private HttpWebRequest CreateRequest(Uri webApiUri,IPAddress adapterAddress)
{
IPEndPoint endPoint = new IPEndPoint(adapterAddress, 0);
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(webApiUri);
webRequest.ServicePoint.BindIPEndPointDelegate =
delegate(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount)
{
if (retryCount == 1)
throw new WebException(string.Format("Cannot bind to adapter {0}", endPoint));
return endPoint;
};
return webRequest;
}