2009-04-20 107 views
2

我有一段時間從silverlight中調用RESTful服務。我遇到了這個錯誤:在Silverlight中使用Web客戶端

{System.Security.SecurityException ---> System.Security.SecurityException: Security error. 
    at System.Net.BrowserHttpWebRequest.InternalEndGetResponse(IAsyncResult asyncResult) 
    at System.Net.BrowserHttpWebRequest.<>c__DisplayClass5.<EndGetResponse>b__4(Object sendState) 
    at System.Net.AsyncHelper.<>c__DisplayClass2.<BeginOnUI>b__0(Object sendState) 
    --- End of inner exception stack trace --- 
    at System.Net.AsyncHelper.BeginOnUI(SendOrPostCallback beginMethod, Object state) 
    at System.Net.BrowserHttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
    at System.Net.WebClient.GetWebResponse(WebRequest request, IAsyncResult result) 
    at System.Net.WebClient.OpenReadAsyncCallback(IAsyncResult result)} 

這似乎是使用webclient時的流行錯誤。我已經建立了一個clientaccesspolicy.xml

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

,我已經觀看了小提琴手的Silverlight和它確實對網站提出請求,也不得到一個200個狀態回來了。

public void login(string userName, string password) 
     { 
      WebClient client = new WebClient(); 
      Uri uri = new Uri(serverURI + "/clientaccesspolicy.xml"); 
      client.OpenReadCompleted += new OpenReadCompletedEventHandler(login_Complete); 
      client.OpenReadAsync(uri); 
     } 

     private void login_Complete(object sender, OpenReadCompletedEventArgs e) 
     { 
      byte[] buffer = new byte[e.Result.Length]; //crashes here with exception 
      ... 
     } 

我或多或少地沒有想法。有人知道我做錯了什麼?是否有直接從文件運行silverlight的問題:// uri?

更新:我刪除了clientaccesspolicy.xml文件,只保留了crossdomain.xml文件,並且賓果遊戲一切正常。這讓我相信這個錯誤發生在clientaccesspolicy文件中,但是我直接從microsoft複製了這個錯誤。是什麼賦予了?

回答

3

如果您的Silverlight應用程序從文件:// URL運行,則無法從網站請求內容。請參閱URL Access Restrictions in Silverlight

+0

這似乎是合乎邏輯的,但並不能真正解釋爲什麼刪除clientaccesspolicy.xml文件修復了它。 – stimms 2009-04-20 02:37:19

0

嗯...

嘗試用

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

我只花了3個小尋找到這個問題非常本跨域文件。跨域訪問策略和客戶端訪問策略文件對我來說是一個死衚衕。沒有什麼會工作。最後,我遇到了一位微軟員工在Silverlight.net論壇上發佈的帖子,幫助我解決了這個問題。

答案,至少在我的情況下是Visual Studio在創建新的Silverlight應用程序時生成的測試網頁。

基本上,當你啓動一個Silverlight項目時你會得到兩個選項。第一個選項將在運行應用程序時動態生成一個html頁面。第二個選項將創建一個單獨的ASP.NET項目,它將託管您的Silverlight應用程序。如果您選擇第一個選項(動態測試頁),您將無法執行任何跨域請求,即使兩個項目位於同一個框中,它也會以某種方式將其視爲跨域調用並失敗(我不確定爲什麼)

創建另一個Silverlight項目,選擇第二個選項,並移動您的XAML文件。這應該可以解決您的問題。

0

X-Cubed是正確的,你不能做file://的跨域請求,正如Adam Berent指出的那樣,這意味着如果你使用Visual Studio生成的TestPage,你的網絡請求將失敗。

解決方法是使用Chiron啓動TestPage(通常用於動態語言)以便爲其提供服務(因爲該訪問位於http://上)或關閉開發Web服務器。

這個問題實際上是你必須手動將調試器附加到瀏覽器才能用網絡進行調試(你不能只打F5。)