2011-01-14 3 views
3

WebBrowser 컨트롤이있는 WP7 Silverlight 응용 프로그램에서 "myttp : //"와 같은 자체 프로토콜을 사용하여 일부 로컬 컨텐트를 전달하려고합니다. 일부 콘텐츠는 필요에 따라 생성되므로 Navigate()를 IsolatedStrorage에 사용할 수 없습니다. 같은 이유로 NavigateToString()도 나에게 유용하지 않다. "//test.html mytp" WebBrowser 컨트롤을 사용하여 자체 프로토콜을 등록하는 방법은 무엇입니까?

은 내가 WebRequestCreator 내 MYTP 프로토콜

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

위해 내려하지만 난에 이동하는 경우가 브라우저 컨트롤에서 호출되지 등록했습니다. 내가 코드를 통해 WebRequest 클래스를 만들 경우 는

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

everythings 잘 작동합니다.

어떤 제안이 잘못 되었습니까? 또는 어떻게해야합니까?

답변

3

WebBrowser 컨트롤은 Windows Phone Internet Explorer 브라우저의 HTTP 스택을 사용하여 웹 요청을 통계합니다. 이 HTTP 스택은 응용 프로그램에서 사용중인 클라이언트 HTTP 스택과 완전히 별개입니다. 따라서 브라우저는 귀하의 프로토콜을 전혀 보지 못합니다.

3

저는 "브라우저 HTTP 스택"이 의미하는 바를 정확히 모르지만 AnthonyWJones 단어에 동의합니다.

표준 실버의 "브라우저의 스택에 접근"은 "일반/따로"System.Net.Browser.WebRequestCreator 대 (System.Net.Browser.WebRequestCreator.BrowserHttp HttpRequest를 공장의 형태 (세션 등을 처리하는 데 사용). ClientHttp factory)는 실제로 WP7의 응용 프로그램 코드에서 사용할 수 있습니다. 그것은 SDK에서 숨겨져 있지만 장치에서 사용할 수 있으며 적은 노력으로 응용 프로그램에서 사용할 수 있습니다. 예를 들어 방출 된 쿠키를 브라우저의 캐시와 동기화 할 수 있습니다. ClientHttp 공장과 매우 ​​유사 임에도 불구하고, 그 공장을 사용하고 웹 브라우저와 동기화에서 이러한 연결에서 처리하는 모든 세션/쿠키/userauth을하면서 설명은, 그러나 my humble other post

를 참조하십시오, 당신은 적어도에서 (발견 7.0 및 7.1 버전)를 사용하면 모든 사용자 정의 접두어를 완전히 무시할 수 있습니다. 이 공장 결과 아무것도 열려고 (. WP7의 절 망고 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() 

관련 코드 :

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*/ 

실행 결과 : 히트 결코

  • breakpoint1
  • 중단 점 2는 "응답"이 NULL임을 알 수 있습니다.
  • 중단 점 3 ne 위에 적혀있는 예외로 인해서 히트가 발생했습니다.

결론적으로 Silverlight 브라우저의 스택은 내장 된 접두어 집합을 사용하기 위해 하드 코드되고 다른 모든 접두사는 무시되거나 ProtocolViolation을 던집니다. 내 추측은 WP7 (7.0, 7.1)에서 사용자 정의 "js : //"가 BrowserHttpWebRequest으로 전달 된 이후 실제로 http를 사용하도록 하드 코딩 된 것입니다.StackTrace에서 볼 수있는 InternalBeginGetRequestStream :

Silverlight의 브라우저 스택 API를 사용하여 사용자 정의 프로토콜 처리기를 정상적으로 작동시키는 방법은 없습니다.

그러나 WebBrowser가이 연결 팩토리를 사용한다는 것에 동의 할 수 없습니다. 숨겨진 팩토리가 BrowserHttp라고 불리우는 것은 사실이지만 웹 브라우저와 사용자 또는 세션 별 설정을 공유한다는 것은 사실입니다. WebBrowser 구성 요소가 아직 연결을 위해 다른 팩토리를 사용한다는 것을 나타 내기 위해 수십 가지를 시도합니다. 그리고 아마 그것은 약간의 원주민입니다. 이에 대한 논거로서, 원래의 BrowserHttp 팩토리를 (에뮬레이터와 전화 모두에서) 그것의 간단한 사용자 정의 구현으로 성공적으로 대체 할 수 있었을뿐만 아니라 현재 사용중인 앱에서 적어도 6 개의 웹 브라우저로 한 번도 사용하지 않았습니다. (에뮬레이터 또는 전화에서도 마찬가지)

관련 문제