Как зарегистрировать собственный протокол с помощью элемента управления WebBrowser? - PullRequest
3 голосов
/ 14 января 2011

В приложении WP7 Silverlight с элементом управления WebBrowser я хочу использовать собственный протокол, такой как «myttp: //», для доставки некоторого локального контента.Я не могу использовать Navigate () для IsolatedStrorage, потому что некоторый контент будет создан по требованию.По той же причине NavigateToString () также не может быть использована для меня.

Я попытался зарегистрировать нисходящий WebRequestCreator для моего протокола MYTP

myCreator = new MyRequestCreator(); 
WebRequest.RegisterPrefix("mytp://", myCreator);

, но он не вызывается из элемента управления браузераесли я перейду на «mytp: //test.html».Если я создаю WebRequest с помощью кода

WebRequest request;
request = WebRequest.Create("mytp://test.html");`

, все работает нормально.

Есть предложения, что не так или как это сделать?

Ответы [ 2 ]

3 голосов
/ 06 сентября 2011

Я согласен со словами AnthonyWJones, хотя я не знаю, что именно он имел в виду под «стеком HTTP браузера».

Стандартный «доступ Silverlight к стеку браузера» (используемый для обработки сессий и т. Д.) В формеSystem.Net.Browser.WebRequestCreator.BrowserHttp фабрика httprequest (в отличие от «обычной / удаленной» системы System.Net.Browser.WebRequestCreator.ClientHttp) фактически доступна для кода приложения в WP7.Он скрыт от SDK, но доступен на устройстве, и с небольшими усилиями приложение может использовать его, например, для синхронизации испускаемых файлов cookie с кэшем браузера.Описание см. В моем другом скромном посте

Однако при использовании этой фабрики и синхронизации всей вашей сессии / файлов cookie / использования пользователя в этих соединениях с веб-браузером, несмотря на то, что они очень похожик фабрике ClientHttp вы обнаружите (по крайней мере, в версиях 7.0 и 7.1), что она совершенно не знает ни о каких пользовательских префиксах.Попытка открыть что-либо с помощью этой фабрики приводит к (WP7 v. Mango 7.1):

A first chance exception of type 'System.Net.ProtocolViolationException' occurred in System.Windows.dll
at System.Net.Browser.BrowserHttpWebRequest.InternalBeginGetRequestStream(AsyncCallback callback, Object state)
at System.Net.Browser.AsyncHelper.BeginOnUI(BeginMethod beginMethod, AsyncCallback callback, Object state)
at System.Net.Browser.BrowserHttpWebRequest.BeginGetRequestStream(AsyncCallback callback, Object state)
at MyApp.MyPage..ctor()

соответствующий фрагмент кода MyPage:

public class WRC : IWebRequestCreate { public WebRequest Create(Uri uri) { return null;/*BREAKPOINT1*/ } }

WebRequest.RegisterPrefix("js://", new WRC()); // register the above handler

brwHttp = (IWebRequestCreate)typeof(System.Net.Browser.WebRequestCreator).GetProperty("BrowserHttp").GetValue(null, null);
var tmp = brwHttp.Create(new Uri("js://blah.blah.blah"));

var yyy = tmp.BeginGetResponse(callback, "wtf");
var response = tmp.EndGetResponse(yyy); /*BREAKPOINT2*/

var zzz = tmp.BeginGetRequestStream(callback, "wtf"); /*<---EXCEPTION*/
var stream = tmp.EndGetRequestStream(zzz); /*BREAKPOINT3*/

Результаты выполнения:

  • точка останова 1 никогда не достигает
  • точка останова 2 позволяет видеть, что «response» равен NULL
  • точка останова 3 никогда не срабатывает из-за исключения, вставленного выше

Мой выводто, что стек Браузера Silverlight жестко задан для использования некоторого встроенного набора префиксов, а все остальные префиксы игнорируются / throwv ProtocolViolation.Я предполагаю, что в WP7 (7.0, 7.1) они фактически жестко запрограммированы на использование http, так как мой пользовательский «js: //» был передан BrowserHttpWebRequest .InternalBeginGetRequestStream, как это видно на трассировке стека:)

Это подтверждает то, что написал Энтони, - нет способа заставить пользовательские обработчики протоколов корректно работать с API стека браузера Silverlight.

Однако я не могу согласиться с тем, что WebBrowser использует эту фабрику соединений.Хотя верно то, что скрытая фабрика называется BrowserHttp, и верно, что она разделяет некоторые настройки для каждого пользователя или сеанса с веб-браузером, все, что я пытаюсь сделать десятками, чтобы указать, что компонент WebBrowser использует еще одну другую фабрику для своих соединений,и вполне вероятно, что это какой-то родной.В качестве аргумента для этого я могу лишь указать, что мне удалось успешно заменить оригинальную фабрику BrowserHttp моей простой пользовательской реализацией (как на эмуляторе, так и на телефоне), и, по крайней мере, с 6 веб-браузерами в моем текущем приложении, онане использовался вообще, ни разу!(ни на эмуляторе, ни на телефоне)

3 голосов
/ 14 января 2011

Элемент управления WebBrowser будет использовать стек HTTP обозревателя Internet Explorer для Windows Phone для проверки веб-запросов.Этот стек HTTP полностью отделен от клиентского стека HTTP, используемого приложением.Следовательно, браузер вообще не видит ваш протокол.

...