2011-02-05 7 views
1

Silverlight가 clientaccesspolicy.xml 파일을 다운로드하는 상황을 이해하는 데 문제가 있습니다. 설명이 필요한 런타임 환경에 몇 가지 문제가 있습니다.Silverlight clientaccesspolicy.xml 및 Azure dev 저장소

dev 패브릭에서 전체 IIS 모드로 실행되는 Azure 웹 응용 프로그램입니다. 정의 된 두 개의 사이트, App 및 Admin이 있습니다. 두 포트 모두 포트 : 80에 있기 때문에 호스트 헤더 인 app.dev.com 및 admin.dev.com을 통해 액세스 할 수 있습니다. 둘 다 내 HOSTS 파일에 127.0.0.1을 가리키는 항목이 있습니다. 두 클라이언트 앱에 모두 액세스하면 문제가 없습니다. Silverlight가로드되고 정의 된 RIA 서비스에 아무런 문제가 없습니다.

Silverlight 클라이언트가 dev 저장소에서 blob에 액세스하려고 할 때 문제가 발생합니다. problem has been explained before 그래서 나는 너무 깊게 가지 않을 것입니다 - 최종선, dev 파일 저장 방법이 어떻게 작동하는지 XML 파일을 웹 루트에 넣을 수 없습니다 (http://127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml). 해결책은 URL을 다시 매핑하는 역방향 프록시입니다. 나는 Fiddler rule으로 완료했습니다. "요구가 그 요청을 수정 127.0.0.1:11000에 대한 오면 : 10000, 대신 GET"이것이 않는 것은이 지금까지 매핑에 관한 한 작동

if (oSession.host == "127.0.0.1:11000") { 
    oSession.host = "127.0.0.1:10000"; 
} 
if (oSession.url == "127.0.0.1:10000/clientaccesspolicy.xml") { 
    oSession.url = "127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml"; 
} 

등; 내 브라우저에서 http://127.0.0.1:11000/clientaccesspolicy.xml를 쳤고 파일이 실제로 127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml에서 생활 얻을 수 있습니다 :

<?xml version="1.0" encoding="utf-8"?> 
<access-policy> 
    <cross-domain-access> 
    <policy> 
     <allow-from http-methods="*" http-request-headers="*"> 
     <domain uri="*" /> 
     </allow-from> 
     <grant-to> 
     <resource path="/" include-subpaths="true" /> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy> 

다음이 http://app.dev.com:81/default.aspx에 액세스 실버 라이트 클라이언트에서 실패를 (당신을 생각 나게 할이다) HOSTS에 127.0.0.1 피들러에서 찾고 예외

System.Security.SecurityException ---> System.Security.SecurityException: Security error. 
at System.Net.Browser.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
at System.Net.Browser.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState) 
at System.Net.Browser.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState) 

private void DownloadFile() 
{ 
    var sampleUri = new Uri("http://127.0.0.1:11000/devstorageaccount1/mycontainer/myblob.bin"); 
    var client = new WebClient(); 
    client.OpenReadCompleted += blobDownloaded; 
    client.OpenReadAsync(sampleUri); 
} 
void blobDownloaded(object sender, OpenReadCompletedEventArgs e) 
{ 
    if (e.Error != null) throw e.Error; 
    //throws 
} 

에 다시 매핑의 clientaccesspolicy.xml 파일이었다 다운로드되지! 나는 왜, 또는 그것을 어떻게 디버그하는지 모른다. 내 브라우저에서 블롭을 다운로드 할 수 있습니다. 왜 XML 파일을 다운로드하기 전에 이것이 던져 버릴지 설명 할 수 있습니까?

if (oSession.host == "app.dev.com:10000") { 
    oSession.host = "127.0.0.1:10000"; 
} 
if (oSession.url == "127.0.0.1:10000/clientaccesspolicy.xml") { 
    oSession.url = "127.0.0.1:10000/devstoreaccount1/clientaccesspolicy.xml"; 
} 

var sampleUri = new Uri("http://app.dev.com:10000/devstorageaccount1/mycontainer/myblob.bin"); 

에 다운로드 할 URL을 변경 그리고이 일이 성공 :

그때 나는 그 피들러 규칙을 업데이트 시도! Fiddler 캡처는 먼저 다운로드 된 clientaccesspolicy.xml 파일과 blob을 다운로드 한 것을 보여줍니다.

아무도 여기에 무슨 일이 일어나는지 설명 할 수 있습니까? 두 경우 모두 Silverlight 앱은 http://app.dev.com:81/default.aspx에 액세스하고 있습니다. http://127.0.0.1:11000에서 blob을 다운로드하려고 시도하면 첫 번째 clientaccesspolicy.xml을 다운로드하지 않고 SecurityException 이 실패합니다. 그러나 http://app.dev.com:10000에서 블롭을 다운로드하면 clientaccesspolicy.xml을 먼저 다운로드 한 다음 blob을 다운로드하면 성공합니다.

도움을 주셔서 감사합니다.이 사람은 저를 곤혹스럽게합니다.

답변

1

127.0.0.1 로의 트래픽은 대개 프록시를 건너 뜁니다. 따라서 Fiddler가 URL을 다시 쓰지 못하는 것 같아요. 대신 ipv4.fiddler에서 Silverlight를 가리켜 작동하도록 할 수 있습니다.

+0

스티브 답장을 보내 주셔서 감사합니다. Fiddler가 강제로 Firefox를 사용하고 있으며 http : //127.0.0을 눌렀습니다.1 : 10000/clientaccesspolicy.xml 브라우저에서 Fiddler를 통해 요청을 확인합니다. Silverlight가 브라우저를 대신하여 네트워크 요청을 처리한다고 생각했기 때문에 SL이 요청을했을 때 수동 요청 중에이를 보았을 때 볼 수있었습니다. –

+0

그게 틀림 없어. [이 도구] (http://agazuredevstoreproxy.codeplex.com/)를 통해 프록시 할 때 127.0.0.1 이상에서 작동합니다. Firefox에서 직접 Silverlight를 통해 가져올 때와 Firefox에서 Silverlight를 통해 가져올 때 127.0.0.1에 대한 동작이 일치하지 않습니다. –

+0

Silverlight는 기본적으로 브라우저의 HTTP 스택을 사용한다고 생각하기 때문에 이상한 점에 동의합니다. – smarx

관련 문제