Фон
У меня есть мобильное встроенное устройство (Ubuntu / Mono) с 2 сетевыми адаптерами. Один из них WiFi, а другой 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;
}