Привязка веб-запросов к определенному сетевому адаптеру - PullRequest
0 голосов
/ 30 августа 2018

Фон

У меня есть мобильное встроенное устройство (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;
  }
...