Статьи

Совместное использование сеансов между HttpClient и WebViews на телефонах Windows

Прежде чем мы углубимся в детали поста в блоге, было бы полезно дать некоторый контекст того, чего мы пытаемся достичь, согласитесь? Я работал над гибридным мобильным приложением, которое требует отображения / содержания нескольких мобильных приложений в элементе управления WebView. В фоновом режиме некоторые запросы Http должны проходить для сбора данных и дальнейшей обработки. Нам нужно поддерживать один и тот же сеанс во всех веб-запросах, проходящих через мобильное приложение. Это означает, что все веб-запросы (http), созданные Webview, а также наши фоновые (httpClient) запросы должны предоставлять файлы cookie, кэш и т. Д. Итак, как нам это сделать? Это то, что я покажу вам в этом блоге.

System.Net.Http.HttpClient

HttpClient стал доступной библиотекой для всего, что касается Http, особенно благодаря поддержке HttpClient в PCL (Portable Class Library), которая может этому противостоять. Поэтому моей первой мыслью, когда я рассмотрел это требование, было использование HttpClient с HttpClientHandler, сохранение файлов cookie сеанса и совместное использование их с WebView. Я начал свой первый поиск в Google и обнаружил, что кто-то сделал именно это, вы можете найти его здесь . Это придало мне больше уверенности в том, что это выполнимо и сработало для кого-то, так что это первый подход, который я мог бы использовать.

Этот первый подход будет означать использование HttpClient (вместе с HttpClientHandler) для хранения файлов cookie и предоставления к ним доступа в веб-просмотре. Однако это может привести к ошибкам, потому что мне нужно будет постоянно следить за обоими файлами cookie и обновлять другую группу запросов. Кроме того, совместное использование кэша данных между WebView и HttpClient все еще будет проблемой, которую я не знал, как решить.

Windows.Web.HttpClient

Прежде чем идти дальше, я подумал, что я буду искать альтернативу, и я нашел Windows.Web.HttpClient . Этот вид казался очень похожим на System.Net.Http.HttpClient , но реализация совершенно иная, независимо от точного соответствия имени :). Я нашел это видео (ниже) от Microsoft // Build confernece, и в нем подробно рассказывается об этой реализации HttpClient, которая больше ориентирована на разработку Windows, как видно из названия.

Очевидно, что реализация HttpClient в Windows дает вам возможность настраивать все аспекты ваших http-запросов. В приведенном выше видео перечислены следующие пять причин, по которым вам следует использовать Windows.Web.HttpClient:

  1. Общие Cookies, Cache и Credentails (я думал, что это слишком хорошо, чтобы быть правдой)
  2. Сильно типизированные заголовки => меньше ошибок
  3. Доступ к файлам cookie и общим файлам cookie
  4. Контроль над кэшем и кэшем Sahred
  5. Внедрить ваши модули кода в конвейер обработки => более чистая интеграция

Когда я прочитал первое утверждение выше, я действительно подумал, что это слишком хорошо, чтобы быть правдой, именно то, что я ищу. Поэтому я решил попробовать. Как вы можете видеть, некоторые функции, перечисленные для этого HttpClient (реализация Windows), похожи на те, что есть в мире System.Net, но это дает нам дополнительные возможности.

HttpClientHandlers против HttpBaseProtocolFilter

Стоит отметить, что библиотека Windows.Web не имеет HttpClientHandlers, с которым мы знакомы в System.Net, а дает вам возможность делать больше с HttpBaseProtocolFilter, и это ключевой момент. HttpBaseProtocolFilter позволяет нам, разработчикам, настраивать / манипулировать http-запросами (заголовками, файлами cookie, кешем и т. Д.), И эти изменения будут применены повсеместно в вашем приложении. Это применяется независимо от того, выполняете ли вы http-запрос программно с помощью httpClient или через пользовательский интерфейс (например, с помощью webView).

Время кода


  // creating the filter
  var myFilter = new HttpBaseProtocolFilter();
  myFilter.AllowAutoRedirect = true;
  myFilter.CacheControl.ReadBehavior = HttpCacheReadBehavior.Default;
  myFilter.CacheControl.WriteBehavior = HttpCacheWriteBehavior.Default;

  // get a reference to the cookieManager (this applies to all requests)
  var cookieManager = myFilter.CookieManager;

  // make the httpRequest
  using (var client = new HttpClient()) 
  {
     HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "your-url-address"); 

     // add any request-specific headers here
     // more code been omitted

     var result = await client.SendRequstAsync(request);
     result.EnsureSuccessStatusCode();

     var content = await result.Content.ReadAsStringAsync();

     // now we can do whatever we need with the html content we got here 
     // Debug.WriteLine(content);
  }

  // assuming that the previous request created a session (set cookies, cached some data, etc)
  // subsequent requests in the webview will share this data
  myWebView.Navigate(new Uri("your-url-address"));

Надеемся, что этот короткий фрагмент кода даст вам хорошее представление о том, что вы можете сделать с помощью реализации HttpClient в Windows.

Другие приложения?

Можно спросить, как это повлияет на другие приложения? и ответ — нет. Как вы увидите на видео (если вы посмотрите его :)), библиотека Windows.Web была разработана для работы со всеми запросами в одном приложении . Поэтому вам не нужно беспокоиться о воздействии на другие приложения или утечке данных для другого внешнего запроса.

Выводы

Кто-то мудрый однажды сказал: «С большой силой приходит большая ответственность». Это следует помнить при использовании HttpBaseProtocolFilter в http-запросах, поскольку это может повлиять на все последующие запросы. Надеюсь, вы нашли это полезным и хотели бы услышать ваши комментарии и отзывы.