Silverlight WCF Self Hosting似乎没有找到ClientAccessPolicy.xml

时间:2011-05-10 17:25:40

标签: wcf hosting self

我在本地机器上创建了WCF自托管服务,Silverlight App获取数据 从此服务并将其发送到远程服务器。它运作了一个多月 但突然停止抱怨众所周知的错误clientaccesspolicy.xml未解决。 经过相当长的一段时间调试后,我意识到自远程服务器以来它失败了 例如,地址已更改为IP地址而不是域地址 http://2xx.1xx.223 iso http://www.myserver.com,但域名地址不再可用 所以我无法重现它并且不确定真正解决变化是罪犯。

如果webserver和自托管服务都在我的开发中运行,它仍然可以正常工作 机器,我可以在我的浏览器中看到文件“http:// localhost:8000 / clientaccesspolicy.xml” 如果键入“http:// my-machine-name:8000 / clientaccesspolicy.xml”,则会出现404错误。 当我阅读一些博客时,clientaccesspolicy.xml应该位于本地机器的80端口 但是我不知道怎么做,也不确定是不是会出问题。

我的服务主机配置如下;

          string baseAddress = "http://localhost:8000";
         //Create a ServiceHost for the OPCService type and 
         //provide the base address.
        _serviceHost = new ServiceHost(typeof(OpcService), new Uri(baseAddress));
        _serviceHost.AddServiceEndpoint(typeof(IOpcService), new BasicHttpBinding(), new Uri(baseAddress + "/OpcService"));
        _serviceHost.AddServiceEndpoint(typeof(IPolicyRetriever), new WebHttpBinding(), "").Behaviors.Add(new WebHttpBehavior());

通过接口

使用clientacceccpolicy.xml
       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);
    }

Silverlight客户端使用不带ServiceReferences.ClientConfig的代理服务 但是服务参考很容易获得网络方法。

       public class ServiceProxy
{
    private const string ServiceEndPoint = "http://localhost:8000/OpcService";
    private static Uri _serviceMap = new Uri(ServiceEndPoint, UriKind.Absolute);

    public static T GetProxyFor<T>()
    {
        return new ChannelFactory<T>(new BasicHttpBinding(), new EndpointAddress(_serviceMap)).CreateChannel();
    }

    [Export]
    public IOpcService SyrOpcService
    {
        get { return GetProxyFor<IOpcService>(); }
    }

    public static SYR.HMI.OpcProxy.ServiceReference.OpcServiceClient GetProxy()
    {
        return new SYR.HMI.OpcProxy.ServiceReference.OpcServiceClient();
    }
}

我在这里阅读了许多帖子和谷歌,但不太像我的,但对我来说仍然含糊不清 哪一个是问题,IP地址更改或clientaccesspolicy文件位置。

善意的建议将不胜感激。 提前谢谢。

HK.Lee

1 个答案:

答案 0 :(得分:1)

我用2个小方法制作了小型SL测试应用程序并更改了ClientConfig的端点地址 进入http://ipv4.fiddler:8000而不是http://locahost:8000

Fiddler从127.0.0.1 iso localhost查看clientaccesspolicy.xml, 所以我将SL客户端代理地址更改为127.0.0.1而不是localhost。 一切正常。

如果从IP地址vc域名下载xap,localhost无效的原因很有趣? 我不知道细节,但任何人都会给出一些建议。

HK.lee