2011-05-17 85 views
1

我們有一個WCF服務在遠程服務器上運行。它作爲Windows服務運行,不在IIS中託管。我們可以從我們的WinForms和WFP應用程序中打這個WCF服務,沒有任何問題。但是,當我們嘗試從Silverlight 4應用程序中點擊時,我們得到以下錯誤:Silverlight 4 WCF「跨域」錯誤

嘗試向URI請求'http://111.111.111.111/8484/Psn'時發生錯誤。這可能是由於嘗試以跨域方式訪問服務而沒有適當的跨域策略或者不適合SOAP服務的策略。您可能需要聯繫服務的所有者以發佈跨域策略文件,並確保它允許發送與SOAP相關的HTTP頭。使用Web服務代理中的內部類型而不使用InternalsVisibleToAttribute屬性也可能導致此錯誤。有關更多詳細信息,請參閱內部例外。

有人可以把這個英文和解釋我可以做什麼來滿足Silverlight?

回答

2

首先要檢查的是在WCF服務主機上有一個clientaccesspolicy.xml文件或crossdomain.xml文件。這些文件都可以用來控制哪些域可以訪問您的服務。沒有他們,沒有人可以從Silverlight獲得任何訪問權限。這些文件住在WCF服務主機的根:

If, for example, the service is hosted in http://fabrikam.com then the file must be located at http://fabrikam.com/clientaccesspolicy.xml ... [or] ... http://fabrikam.com/crossdomain.xml .

以下clientaccesspolicy.xml文件將允許訪問從http://www.example.com而是從其他地方阻止它:

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

類似crossdomain.xml文件將是:

<?xml version="1.0"?> 
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"> 
<cross-domain-policy> 
    <allow-http-request-headers-from domain="http://www.example.com" headers="SOAPAction,Content-Type"/> 
</cross-domain-policy> 

Source

+0

釷謝謝你。兩個問題。我究竟會在哪裏放這個文件?如果我不知道(或關心)允許訪問哪些URL,該怎麼辦?我們將有來自全國各地的客戶打這個WCF服務。我們無法知道所有的網址。 – Hosea146 2011-05-17 21:04:40

+0

@ Hosea146 - 你把文件放在服務的根目錄下。如果您想允許公開訪問,您還可以爲域使用通配符。 – ChrisF 2011-05-17 21:06:07

+0

我們的WCF服務安裝在C:\ Program Files \ Windows \ PsnService中。那麼文件會去那裏?另外,你能給我一個使用通配符的域的例子嗎?我不確定我需要的格式。 – Hosea146 2011-05-17 21:15:40