【问题标题】:Silverlight to self hosted WCFSilverlight 到自托管 WCF
【发布时间】:2011-02-06 16:31:07
【问题描述】:

我有一个 Silverlight 应用程序,其中有一个 WCF。 由于它是一个自托管的 WCF,我知道我必须添加一个类似的接口:

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

和实现:

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-policy SYSTEM ""http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd"">
        <cross-domain-policy>
            <allow-access-from domain=""*"" />
        </cross-domain-policy>";
        return StringToStream(result);
    }

但我不明白接下来我必须执行哪些步骤才能使 Silverlight 调用 WCF 不会引发通信异常。

你能告诉我我必须写的代码吗? (当我用谷歌搜索它时,我不明白 WCF 何时调用以检索客户端访问策略,以及我必须添加的端点是什么,我是 silverlight 和 WCF 的新手,不知道为什么我必须添加端点...)

这是我的 ServiceReference.ClientConfig:

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

谢谢!

【问题讨论】:

标签: silverlight wcf clientaccesspolicy.xml


【解决方案1】:

Silverlight Http 堆栈 (HTTP clientaccesspolicy.xml)

必须托管在目标域的根目录中。可以通过网络浏览器轻松检查。 Silverlight 会自动检查一次。

Silverlight 3 套接字(自定义策略服务器)

我已经为 Silverlight for Log2Console 应用程序制作了这个策略服务器。

我认为这段代码可能对SL Policy Server有帮助。

它必须托管在特殊端口 TCP 端口 943 上。

Silverligt 4 个套接字(默认情况下与 SL3 中一样,但可以选择加入 HTTP)

将传递给 Socket.ConnectAsync 的 SocketAsyncEventArgs 上的 SocketAsyncEventArgs.SocketClientAccessPolicyProtocol 属性设置为 SocketClientAccessPolicyProtocol.Http。

Silverlight 可能的端口范围

80、443、4502-4532(如果在 clientaccesspolicy.xml 中允许)

Detailed documentation

【讨论】:

  • 您只需要在您的服务器端托管我的策略服务器。 Silverlight 自动调用策略服务器。并且策略服务器不是您希望 WCF 使用的 HTTP 服务器。
  • 可能你的端口是我们允许的范围
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2012-09-05
  • 2011-11-16
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多