Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Silverlight 4访问自托管WCF服务_Wcf_Silverlight - Fatal编程技术网

从Silverlight 4访问自托管WCF服务

从Silverlight 4访问自托管WCF服务,wcf,silverlight,Wcf,Silverlight,我有一个自托管的WCF 4服务,通过Silverlight 4客户端的basicHttpBinding和其他客户端的wsHttpBinding满足相同的合同。这里提供的代码非常简短 尝试从WCF访问a服务方法时出现以下错误: Message=尝试向URI发出请求时出错 http://localhost:8008/WCF4Silverlight.MyService/SL. 这可能是 由于尝试以跨域方式访问服务而没有 适当的跨域策略,或不合适的策略 用于SOAP服务。您可能需要联系服务的所有者以 发

我有一个自托管的WCF 4服务,通过Silverlight 4客户端的basicHttpBinding和其他客户端的wsHttpBinding满足相同的合同。这里提供的代码非常简短

尝试从WCF访问a服务方法时出现以下错误:

Message=尝试向URI发出请求时出错 http://localhost:8008/WCF4Silverlight.MyService/SL. 这可能是 由于尝试以跨域方式访问服务而没有 适当的跨域策略,或不合适的策略 用于SOAP服务。您可能需要联系服务的所有者以 发布跨域策略文件并确保它允许 要发送的SOAP相关HTTP头。此错误也可能由以下原因引起: 在web服务代理中使用内部类型而不使用 InternalsVisibleToAttribute属性。请查看内部异常 更多细节

我确实有一个方法,GetClientAccessPolicy使用WebGet属性为跨域策略提供服务,我有点确信正确地公开它会有问题。我们将非常感谢你对这个问题的洞察。如果我打字http://localhost:8008/WCF4Silverlight.MyService/clientaccesspolicy.xml 在浏览器中,我确实得到了相同的xml,但是来自Silverlight的调用总是失败,并出现上述错误

以下是WCF服务的代码:

以下是WCF服务主机的app.config:

以下是Silverlight客户端的ServiceReferences.ClientConfig:


如果您使用的是自托管web服务,则需要将ClientAccessPolicy.xml放入可在计算机端口80上访问的网站的根目录中,例如。这在Silverlight 4中是新的,不幸的是,我还没有在MS文档中找到明确的解释。已经提到了,但还不十分清楚。

如果您使用的是自托管web服务,则需要将ClientAccessPolicy.xml放入可以在您的计算机的端口80上访问的网站的根目录中,例如。这在Silverlight 4中是新的,不幸的是,我还没有在MS文档中找到明确的解释。已经提到了,但并不十分清楚。

调试此类问题的最简单方法是使用Fiddler www.fiddler2.com拦截HTTP流量。您将立即看到是否请求了clientAccessPolicy.xml、请求的位置以及结果

如果找不到404资源,则文件不在预期位置,但我认为您的webGet注释很好,否则问题出在xml本身

这是一个非常宽松的clientAccessPolicy.xml,我通常用于开发/测试目的:

<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

调试此类问题的最简单方法是使用Fiddler www.fiddler2.com拦截HTTP流量。您将立即看到是否请求了clientAccessPolicy.xml、请求的位置以及结果

如果找不到404资源,则文件不在预期位置,但我认为您的webGet注释很好,否则问题出在xml本身

这是一个非常宽松的clientAccessPolicy.xml,我通常用于开发/测试目的:

<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>

这就是我为解决问题所做的:

我使用Fiddler查看WCF呼叫的方向。Fiddler告诉我们调用无法承载-http:/localhost:8008和URL-/clientaccesspolicy.xml

2使用WebGet for/ClientAccessPolicy.xml创建了另一个类ClientAccessPolicy,该类实现IClientAccessPolicy

3在主机的app.config中为承载Clientaccesspolicy类的新服务添加了另一节。这一个的基址为http:/localhost:8008/

    <service name="WCF4Silverlight.ClientAccessPolicy" behaviorConfiguration="ClientAccessPolicyBehavior"> 
 <host> 
   <baseAddresses> 
  <add baseAddress="http://localhost:8008/"/> 
   </baseAddresses> 
 </host> 
 <endpoint address="" binding="webHttpBinding" bindingConfiguration="webHttpBinding_IMyService" behaviorConfiguration="webHttpBehavior" contract="WCF4Silverlight.IClientAccessPolicy" /> 
</service>
5在Silverlight客户端中,删除对WCF的现有引用,并将该引用添加到新托管的服务中


Silverlight的WCF呼叫现在正在进行。

这就是我为解决问题所做的:

我使用Fiddler查看WCF呼叫的方向。Fiddler告诉我们调用无法承载-http:/localhost:8008和URL-/clientaccesspolicy.xml

2使用WebGet for/ClientAccessPolicy.xml创建了另一个类ClientAccessPolicy,该类实现IClientAccessPolicy

3在主机的app.config中为承载Clientaccesspolicy类的新服务添加了另一节。这一个的基址为http:/localhost:8008/

    <service name="WCF4Silverlight.ClientAccessPolicy" behaviorConfiguration="ClientAccessPolicyBehavior"> 
 <host> 
   <baseAddresses> 
  <add baseAddress="http://localhost:8008/"/> 
   </baseAddresses> 
 </host> 
 <endpoint address="" binding="webHttpBinding" bindingConfiguration="webHttpBinding_IMyService" behaviorConfiguration="webHttpBehavior" contract="WCF4Silverlight.IClientAccessPolicy" /> 
</service>
5在Silverlight客户端中,删除对WCF的现有引用,并将该引用添加到新托管的服务中


来自Silverlight的WCF调用现在正在进行。

在没有IIS的计算机上,如果无法从根目录提供clientaccesspolicy,则可以使用此方法在端口80上动态提供策略:


没有IIS的计算机上的自托管服务,无法从中提供clientaccesspolicy 根用户可以改为使用此方法在端口80上动态提供策略:


我以前在Silverlight中遇到过跨域策略问题。我创建了一个Flash策略文件,而不是Silverlight策略,效果很好。Silverlight将向这两位致敬。你可以试试。我以前在Silverlight中遇到过跨域策略问题。我创建了一个Flash策略文件,而不是Silverlight策略,效果很好。Silverlight将向这两位致敬。你可以试试。谢谢你的建议,但我认为在最后一个场景中,我们不会有一个网站在端口80监听。你可能没有选择:-。根据我的经验,将ClientAccessPolicy.xml文件放在网站的根目录上监听端口80是实现这一点的唯一方法。当然,我可能错了。我使用了Fiddler,它告诉我调用无法承载-http:/localhost:8008和URL-/clientaccesspolicy.xml。这就是我所做的:1创建了一个不同的类ClientAccessPolicy,使用WebGet for/ClientAccessPolicy.xml实现IClientAccessPolicy。2在主机的app.config中为承载Clientaccesspolicy类的新服务添加了另一节。这一个在宿主代码中的基址为http:/localhost:8008/3,创建了另一个ServiceHost实例,并使用Clientaccesspolicy启动了新服务……仍然是相同的错误消息……真糟糕!!谢谢你的建议,但我认为在最后一个场景中,我们不会有一个网站在端口80监听。你可能没有选择:-。根据我的经验,将ClientAccessPolicy.xml文件放在网站的根目录上监听端口80是实现这一点的唯一方法。当然,我可能错了。我使用了Fiddler,它告诉我调用无法承载-http:/localhost:8008和URL-/clientaccesspolicy.xml。这就是我所做的:1创建了一个不同的类ClientAccessPolicy,使用WebGet for/ClientAccessPolicy.xml实现IClientAccessPolicy。2在主机的app.config中为承载Clientaccesspolicy类的新服务添加了另一节。这一个在宿主代码中的基址为http:/localhost:8008/3,创建了另一个ServiceHost实例,并使用Clientaccesspolicy启动了新服务……仍然是相同的错误消息……真糟糕!!我使用了Fiddler,它告诉我调用无法承载-http:/localhost:8008和URL-/clientaccesspolicy.xml。这就是我所做的:弗朗西斯科·德·维托里,谢谢你引导我认识小提琴手。这有助于缩小问题的范围。我使用了Fiddler,它告诉我调用无法承载-http:/localhost:8008和URL-/clientaccesspolicy.xml。这就是我所做的:弗朗西斯科·德·维托里,谢谢你引导我认识小提琴手。这有助于缩小问题的范围。
<?xml version="1.0" ?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
    <service name="WCF4Silverlight.ClientAccessPolicy" behaviorConfiguration="ClientAccessPolicyBehavior"> 
 <host> 
   <baseAddresses> 
  <add baseAddress="http://localhost:8008/"/> 
   </baseAddresses> 
 </host> 
 <endpoint address="" binding="webHttpBinding" bindingConfiguration="webHttpBinding_IMyService" behaviorConfiguration="webHttpBehavior" contract="WCF4Silverlight.IClientAccessPolicy" /> 
</service>
ServiceHost clientAccessPolicyHost = new ServiceHost(typeof(ClientAccessPolicy)); clientAccessPolicyHost.Open();