Прежде чем мы углубимся в детали поста в блоге, было бы полезно дать некоторый контекст того, чего мы пытаемся достичь, согласитесь? Я работал над гибридным мобильным приложением, которое требует отображения / содержания нескольких мобильных приложений в элементе управления 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:
- Общие Cookies, Cache и Credentails (я думал, что это слишком хорошо, чтобы быть правдой)
- Сильно типизированные заголовки => меньше ошибок
- Доступ к файлам cookie и общим файлам cookie
- Контроль над кэшем и кэшем Sahred
- Внедрить ваши модули кода в конвейер обработки => более чистая интеграция
Когда я прочитал первое утверждение выше, я действительно подумал, что это слишком хорошо, чтобы быть правдой, именно то, что я ищу. Поэтому я решил попробовать. Как вы можете видеть, некоторые функции, перечисленные для этого 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-запросах, поскольку это может повлиять на все последующие запросы. Надеюсь, вы нашли это полезным и хотели бы услышать ваши комментарии и отзывы.