Silverlight访问WCF服务引发跨域错误

问题描述 投票:0回答:4

我知道这个问题已经回答了很多次,但是由于某种原因我无法解决。我希望有人可以解决我的问题,这对许多人来说可能是直截了当的,但是我有些无法解决,因为我对Silverlight和Web相对较新。我尝试了跨网域错误在Internet上提供的所有可能示例,但无法修复。如果能在我遇到的这个问题上帮助我,我将不胜感激。

我正在从Silverlight 4客户端访问WCF服务。我在wwwroot中有Clientacccesspolicy.xml和Crossdomain.xml。

我可以使用[http://localhost/Remoteapp.html]访问我的文件。但是,当应用程序尝试进​​行Web服务调用时,尽管在根目录中有Clientaccesspolicy.xml文件,但我却遇到了跨域错误。

在webdevelopementhelper中,我可以看到wcfservice端口正在请求clientaccesspolicy,该端口是[http // localhost:600061 / clientaccesspolicy.xml],这是我的服务所在的位置,并且我收到502响应[连接失败]。

当我在浏览器中键入[http://localhost/Clientaccesspolicy.xml]时,我可以找到该文件。但是Silverlight正在错误的位置请求策略文件。

所有东西在设计时都能正常工作,但是当我将其部署到IIS时,我会收到此错误。

有人可以帮助我解决此问题吗?在此先感谢每一位。

wcf silverlight iis-7 crossdomain.xml clientaccesspolicy.xml
4个回答
0
投票

步骤1:检查WCF服务主机上是否具有clientaccesspolicy.xml文件或crossdomain.xml文件。

以下clientaccesspolicy.xml

<?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 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="*" headers="*"/>
</cross-domain-policy>

如果不起作用,请尝试以下步骤

  1. 在部署了Silverlight应用程序的服务器上,通常在ASP.NET应用程序的ClientBin文件夹中,将silverlight应用程序文件* .xap重命名为* .zip

  2. 提取压缩文件的内容

  3. 编辑ServiceReferences.ClientConfig文件

  4. 将端点地址从本地主机更新为承载WCF服务的服务器地址。

  5. 保存文件。压缩内容,然后重命名回.xap


0
投票

步骤1:将带有以下代码的crossdomain.xml放入Web服务托管文件夹。

<?xml version="1.0" ?>
<cross-domain-policy>
    <site-control permitted-cross-domain-policies="master-only"/>
    <allow-access-from domain="*"/>
    <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

步骤2:添加上述WCF Web服务的引用时,也将相同的文件放入silverlight项目中。

步骤3:更新您的参考并发布silverlight项目。

尝试这些步骤。它肯定会工作。


0
投票

我也遇到了同样的问题,经过一周的探索,我知道在根目录中拥有ClientAcessPolicy.xml和CrossDomainPolicy.xml不会满足您的请求,必须通过以下方式发送ClientAcessPolicy.xml和CrossDomianPolicy.xml仅服务。

按照以下步骤解决此问题

  1. 在Iservice1.cs中添加新的命名空间,如下所示

    [ServiceContract(Namespace = "http://ServiceWCF")]
    
    public interface IPolicyRetriever
     {
       [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
    
       Stream GetSilverlightPolicy();
    
       [OperationContract, WebGet(UriTemplate = "/crossdomain.xml")]
    
       Stream GetFlashPolicy();
     };
    
  2. 现在通过编辑来编辑Service1.svc文件,

    public class PolicyClass : IPolicyRetriever
    {
        Stream StringToStream(string result)
        {
            WebOperationContext.Current.OutgoingResponse.ContentType = "application/xml";
            return new MemoryStream(Encoding.UTF8.GetBytes(result));
        }
        public Stream GetSilverlightPolicy()
        {
            string result = @"<?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>";
            return StringToStream(result);
        }
        public Stream GetFlashPolicy()
        {
            string result = @"<?xml version=""1.0""?>
                            <!DOCTYPE cross-domain-policySYSTEM""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
                            <cross-domain-policy>
                                <allow-access-from domain=""*"" />
                            </cross-domain-policy>";
            return StringToStream(result);
        }
    }
    
  3. 现在将两个文件都添加到项目位置中

  4. 为了更好地避免某些问题,我们也可以将两个文件都添加到根文件夹中

0
投票

这些是在服务启动并运行后,还必须在Internet Explorer中进行的一些更改,现在可以在浏览器中测试是否可以从Internet Explorer访问ClientAccesspolicy.xml和Crossdoaminpolicy.xml。完成所有这些操作后,必须在浏览器中将Microsoft Azure VM链接添加为受信任的站点或域。

  1. 首先导航到Internet Explorer-> Internet选项->安全->本地Intranet->站点

现在选中“自动检测Intranet网络的复选框,单击高级并添加虚拟机的相应站点URL

  1. Internet Explorer-> Internet选项->安全->受信任的站点,添加SP2013 URL作为添加的URL

现在在同一窗口中单击“自定义级别”,启用所有.Net Framework,Active X控件,启用.Net Framework安装程序

  1. 现在移至高级选项卡,然后取消选中禁用脚本调试(Internet Explorer),禁用脚本调试(其他)

在同一选项卡中,我们还需要启用某些选项,它们是允许CD上的活动内容在我的计算机上运行,​​允许Active Controls在我的计算机上的文件中运行,启用本机XMLHTTP支持。

完成所有这些操作后,请检查Sliverlight应用程序是否正常运行。确保这些步骤是否正确处理,应用程序将正常运行。

© www.soinside.com 2019 - 2024. All rights reserved.