Привязка веб-запросов к определенному сетевому адаптеру
Фон
У меня есть мобильное встроенное устройство (Ubuntu/Mono) с 2 сетевыми адаптерами. Один из них Wi-Fi, а другой GSM. Требование состоит в том, что, когда адаптер WiFi подключен к Интернету (в пределах диапазона предварительно определенной точки доступа), приложение загружает данные (HTTPS POST) через WiFi, но когда WiFi недоступен, но есть GSM, он загружает данные по линии связи GSM.
тестирование
Чтобы добиться этого, я создал облачный веб-сервис, который возвращает OK, если вы выдадите ему HTTP GET. Идея состоит в том, чтобы поток периодически выдавал запрос GET, привязанный к конкретному адаптеру, и проверял результат. Результат OK означает, что адаптер подключен к Интернету, а время ожидания обычно означает, что это не так. Затем я могу использовать это, чтобы определить, какой адаптер использовать для запросов.
Я создал небольшое тестовое приложение, которое запускает поток, который выдает запросы GET, связанные с конкретным адаптером. Я использую request.BindIPEndPointDelegate для привязки запроса к адаптеру. Когда я запускаю приложение на адаптере WiFi, результат будет таким, как ожидалось. Когда точка доступа WiFi включена, запросы возвращаются в порядке, когда точка доступа отключена, время ожидания запросов истекает. То же самое, когда я запускаю приложение на адаптере GSM.
Однако, когда я обновляю приложение, чтобы запустить 2 потока, один для адаптера WiFi и GSM, возникает проблема. Когда точка доступа включена, запросы WiFi и GSM проходят нормально. Когда я выключаю точку доступа, сначала запрашивается WiFi, но через некоторое время возвращается успешный результат, что неверно. Поскольку URI для обоих потоков одинаков, я подозреваю, что ServicePointManager возвращает одну и ту же ServicePoint обоим потокам и каким-то образом из-за многопоточности это становится бесполезным.
Следующим тестом было создание 2 разных конечных точек. По одному для запросов WiFi и GSM, надеясь, что ServicePointManager всегда будет возвращать разные ServicePoints. К сожалению, это не оказало положительного влияния.
Буду признателен за предложения.
Код выглядит следующим образом:
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;
}