2011-05-17 86 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