我在本地机器上创建了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
答案 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