2008-09-23 171 views
4

我正在從silverlight調用本地託管的wcf服務,我在下面得到了例外。從Silverlight調用WCF服務

我創建了一個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> 

錯誤,而試圖讓 到URI 'http://localhost:8005/Service1.svc' 請求時發生。 這可能是由於跨域 配置錯誤。有關更多詳細信息,請參閱 內部例外。 --->

{System.Security.SecurityException ---> System.Security.SecurityException: 安全錯誤。在在 System.Net.AsyncHelper MS.Internal.InternalWebRequest.Send() 在 System.Net.BrowserHttpWebRequest.BeginGetResponseImplementation() 在 System.Net.BrowserHttpWebRequest.InternalBeginGetResponse(的AsyncCallback 回調,對象狀態)。 <> c__DisplayClass4.b__3(對象sendState)---內 異常堆棧跟蹤的末尾在 System.Net.AsyncHelper.BeginOnUI(BeginMethod beginMethod,AsyncCallback的回調, 對象狀態)在 System.Net.BrowserHttpWebRequest .BeginGetResponse(的AsyncCallback 回調,對象狀態)在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.CompleteSend在 System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelAsyncRequest.OnSend(IAsyncResult的 結果)(IAsyncResult的 結果) }

關於如何進步的任何想法?

回答

0

我首先確定Silverlight實際上是通過使用Fiddler,FireBug或類似工具檢查網絡調用來找到您的客戶端訪問策略文件。

7

還有如果你是在同一位置的Silverlight應用程序從您擔任不需要跨域策略使用WCF服務的一些調試技術listed here ..one更useful post ..

0

。從客戶端返回多個實體之間存在關係的LINQ to SQL數據時,我遇到過類似的錯誤。

首先確保你的WCF服務工作正常。通過創建一個簡單的ping函數來回應它的輸入。確保你可以先打電話。如果這個工作正常,並且你的其他函數沒有使用函數的參數或返回值。如果第一個函數也無法使用像Fiddler這樣的工具來查看通過線路發送的數據。用一個 。在主機的末尾查看localhost的數據。所以像http // localhost:1234./default.aspx,並使用相同的WCF地址。

2

我知道這個服務是否正常工作,因爲我加了它作爲一個基本的網站參考,有效。我會嘗試和Fiddler一起玩,儘管有一個小問題,因爲xaml控件並沒有嵌入到網頁中,它使用內置的測試頁面渲染器。

這裏有幾個指標,這四中必須檢查的需要:

添加clientaccesspolicy.xml爲顯示我的問題。

添加的crossdomain.xml到主機路由:

<!DOCTYPE cross-domain-policy SYSTEM "http://www.adobe.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <allow-http-request-headers-from domain="*" headers="*"/> 
</cross-domain-policy> 

確保結合是basicHttp因爲這是受Silverlight(目前)支持的唯一

的服務需要該屬性:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 

有用的讀數: http://weblogs.asp.net/tolgakoseoglu/archive/2008/03/18/silverlight-2-0-and-wcf.aspx

http://timheuer.com/blog/archive/2008/06/06/changes-to-accessing-services-in-silverlight-2-beta-2.aspx

http://silverlight.net/forums/t/19191.aspx

http://timheuer.com/blog/archive/2008/04/09/silverlight-cannot-access-web-service.aspx

0

我有同樣的問題。我確實看到clientaccesspolicy.xml被silverlight客戶端應用程序成功獲取。我確實通過直接通過firefox請求clientaccesspolicy.xml不是錯誤的。這個政策是開放的,和上面一樣。

現在來了奇怪的轉折。如果我刪除clientaccesspolicy.xml,而添加Flash風格crossdomain.xml策略文件,那麼它的工作原理。我通過檢查網絡看到,如何首先請求clientaccesspolicy.xml失敗,然後silverlight返回到crossdomain.xml。

所以我有一個解決辦法,但我更喜歡使clientaccesspolicy.xml工作,以便沒有額外的不必要的網絡往返。

有什麼建議嗎?

1

不知道你的問題是否相同,但我剛剛討論了我本週末嘗試通過我的SL應用程序與我的控制檯託管的WCF服務交談來實現跨域發生的主要痛苦。

http://wallism.wordpress.com/2009/03/01/silverlight-communication-exception/

概括地說,雖然,你必須具有crossdomain.xml並沒有 '標題= 「*」'

Bad: 
    <allow-access-from domain=""*"" headers="*" /> 

Good: 
    <allow-access-from domain=""*"" /> 
    <allow-http-request-headers-from domain=""*"" headers=""*"" /> 

而不是*你可以有「SOAPAction的頭「(作品的任何一種方式)

哦,當你得到它的工作,你可能要使它安全些:-)

祝你好運!

0

確保WCF服務的端點和綁定已正確定義。從同一應用程序調用WCF服務不需要跨域策略文件。

0

我有一個類似的問題,刪除服務引用,並再次加回來解決了我的問題。