0

我有一个 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>

请帮帮我!

4

2 回答 2

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 项目。

于 2011-02-15T11:20:20.127 回答
0

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

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

于 2011-02-07T17:28:49.027 回答