Я согласен со словами 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 веб-браузерами в моем текущем приложении, онане использовался вообще, ни разу!(ни на эмуляторе, ни на телефоне)