【问题标题】:Silverlight - WCF get clientaccesspolicy on localhostSilverlight - WCF 在本地主机上获取客户端访问策略
【发布时间】:2011-06-22 16:57:45
【问题描述】:

我有一个 Silverlight 应用程序,它使用 WCF 与服务器进行通信。 Silverlight 和 WCF 都在本地计算机 (localhost) 上运行。当 Silverlight 调用该服务时,它会因通信异常而失败。 我知道这是因为我没有 clientaccesspolicy 文件,但由于 WCF 端点在http://localhost:port 上运行,我定义了一个接口 IPolicyRetriver,并向服务添加了一个实现,该实现在流中返回 clientaccesspolicy。

我的问题是,我必须进行哪些配置才能使其正常运行?我知道我必须在我的 ServiceReference.ClientConfig 文件中更改或添加一些内容,但我不明白是什么。我在下面包含了我的 ServiceReference.ClientConfig。请让我知道要更改或添加什么,以及在 Silverlight 中的何处添加此代码。 请不要在此处粘贴任何链接以帮助我,因为我在过去两天打开了所有可能的链接 - 但仍然不明白。

<configuration>
<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IMapService" maxBufferSize="2147483647"
                maxReceivedMessageSize="2147483647">
                <security mode="None" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="../MapService.svc" binding="basicHttpBinding"
            bindingConfiguration="BasicHttpBinding_IMapService" contract="MapService.IMapService"
            name="BasicHttpBinding_IMapService" />
    </client>
</system.serviceModel>

请帮帮我!

【问题讨论】:

    标签: silverlight wcf localhost service-reference


    【解决方案1】:

    您没有包含您提到的 IPolicyRetriever 实现,但这是您可以使用的示例。

    接口规范:

    [ServiceContract]
    public interface IPolicyRetriever
    {
        [OperationContract, WebGet(UriTemplate = "/clientaccesspolicy.xml")]
        Stream GetSilverlightPolicy();
    
        //[OperationContract, WebGet(UriTemplate = "/crossdomain.xml")]
        //Stream GetFlashPolicy();
    }
    

    接口的实现:

        // IPolicyRetriever implementation
        private 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);
         }
    

    然后您可以在服务器的配置 XML 文件中包含以下内容。这需要在服务器端,而不是在客户端。我之所以强调这一点,是因为您在问题中包含了上面的客户端配置。

    <behaviors>
      <endpointBehaviors>
        <behavior name="WebHttpNewBehavior">
          <webHttp />
        </behavior>
      </endpointBehaviors>
      ...
    </behaviors>
    <services>
      <service behaviorConfiguration="NewBehavior">
        <endpoint behaviorConfiguration="WebHttpNewBehavior" binding="webHttpBinding"
                    bindingConfiguration="" name="PolicyEndpoint" contract="WCFService.IPolicyRetriever" />
        ...
      </service>
    </services>
    

    或者,如果您决定以编程方式创建主机(我就是这样做的,而不是使用 ClientConfig 文件,因此上述示例可能不是 100% 正确):

    ServiceHost host = new ServiceHost(serviceType);
    host.AddServiceEndpoint(typeof(IPolicyRetriever), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());
    

    我知道你要求不要提供链接,但我使用 http://blogs.msdn.com/b/asiatech/archive/2010/05/07/how-to-consume-a-self-hosted-wcf-service-in-a-cross-domain-environment-by-silverlight-client.aspx 作为参考来刷新我的记忆,因为我现在无法访问我的 Silverlight/WCF 项目。

    【讨论】:

    • 您应该已经在 WCF 服务器中的某处创建了一个 ServiceHost,以便从 Silverlight 组件进行访问。如果您使用 XML 配置来创建 ServiceHost,则无需在任何地方使用代码 - 您可以使用我包含的 XML。
    • 我需要调用 getSilverlightPolicy 吗?如果是 - 在哪里?如果不是,silverlight 怎么知道怎么称呼它?
    • Silverlight 会自动调用它,因此您无需在任何地方调用它。 Silverlight 实际上会查找特定的 URL,即localhost/clientaccesspolicy.xml。上面的代码“拦截”该 URL 并返回编码的 XML 字符串。如果您通过 IIS 将其作为网站托管,则可以通过提供可通过localhost/clientaccesspolicy.xml URL 访问的实际 XML 文件来获得相同的效果。
    【解决方案2】:

    您不需要对服务配置或代码进行任何更改。将clientaccesspolicy.xml 放在服务网站的ROOT 中。如果您使用的是 Visual Studio,则可能需要更改属性才能使其正常工作。 Silverlight 将查找该文件是否存在。我可能会帮助您使用 Fiddler 之类的工具来查看 Silverlight 在哪里寻找文件。

    我发现有一个链接非常有用,但由于您不想要任何链接,因此我不会提供。

    【讨论】:

    • 我没有任何ROOT服务网站。我在本地主机上运行它。你是什​​么意思财产变化?以及如何使用提琴手?
    • 是的,即使对于 localhost 也有一个根。 “htt p://localhost:PortNumber/”是根目录,Silverlight 将在其中查找 clientaccesspolicy.xml 文件。如果我没记错的话,属性更改是从站点属性页面的“Web”选项卡在 Visual Studio 中将虚拟路径设置为“/”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2010-11-11
    • 2010-12-08
    • 2011-10-24
    • 2011-08-25
    • 2020-03-06
    相关资源
    最近更新 更多