【问题标题】:Silverlight accessing WCF serivce throws Crossdomain errorSilverlight 访问 WCF 服务引发跨域错误
【发布时间】:2013-08-22 17:07:42
【问题描述】:

我知道这个问题已经回答了很多次,但由于某种原因我无法解决。我希望有人可以解决我的问题,这对许多人来说可能很简单,但我有些无法弄清楚,因为我对 silverlight 和 web 还比较陌生。我已经尝试了互联网上所有可能的跨域错误示例,但无法修复它。如果有任何一次可以帮助我解决我面临的这个问题,我将不胜感激。

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

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

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

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

每件事在设计时都能正常工作,但是当我将它部署到 IIS 时出现此错误。

谁能帮我解决这个问题?提前感谢每一个人。

【问题讨论】:

    标签: wcf silverlight iis-7 crossdomain.xml clientaccesspolicy.xml


    【解决方案1】:

    第 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. 解压 zip 文件的内容

    3. 编辑 ServiceReferences.ClientConfig 文件

    4. 将端点地址从 localhost 更新为托管 WCF 服务的服务器地址。

    5. 保存文件。压缩内容并重命名为 .xap

    【讨论】:

    • 上面回复了,因为它的长度我无法粘贴到 cmets 框中
    【解决方案2】:

    第 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 网络服务的引用时,也将相同的文件放入您的 silverlight 项目中。

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

    试试这些步骤。它肯定会起作用。

    【讨论】:

      【解决方案3】:

      我也遇到了同样的问题,经过一周的跟踪,我知道在根目录中拥有 ClientAcessPolicy.xml 和 CrossDomainPolicy.xml 将无法满足您的请求,必须发送 ClientAcessPolicy.xml 和 CrossDomianPolicy.xml仅通过服务。

      按照以下步骤解决此问题

      1. 在Iservice1.cs中添加一个新的NameSpace,如下所示

        [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. 为了避免一些问题,我们也可以将文件添加到根文件夹中

      【讨论】:

        【解决方案4】:

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

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

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

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

        现在在同一窗口中单击自定义级别启用所有 .Net 框架、Active X 控件、启用 .Net 框架设置

        1. 现在移动到高级选项卡并取消选中禁用脚本调试(Internet Explorer)、禁用脚本调试(其他)

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

        所有这些都完成后,检查 Sliverlight 应用程序是否正常运行。确定如果这些步骤处理正确,应用程序将完美运行。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-11-24
          • 2012-09-05
          • 2011-10-15
          • 2011-11-03
          • 2011-08-27
          • 2011-07-25
          • 1970-01-01
          • 2011-05-03
          相关资源
          最近更新 更多