2017-03-02 95 views
6

我已经阅读了大部分涉及跨域错误的主题,但仍然无法正常工作。在网站中,我加载了与WCF Webservice通信的Silverlight模块。在本地主机上,它工作正常,没有发生错误。

我有web服务托管在http://localhost:50283,并在同一个文件夹中的端口50283是指我有clientaccesspolicy.xml位于看起来如下跨域错误Silverlight + WCF

<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> 

我放在clientaccesspolicy.XML几乎无处不在,包括\ wwwroot的但反正没有效果。我可以在本地和同一网络内的其他计算机上访问clientaccesspolicy.xml(显示内容为http://computerIP:50283/clientaccesspolicy.xml)。
我试图拦截错误,以便找出有关错误性质的更多详细信息,但小提琴手不会列出任何错误,唯一的浏览器会执行此操作。从字面上看,我尝试了一切,仍然没有改变。有没有人遇到类似的问题,并可以提供一些提示,以便我寻求解决方案?

我遇到了类似的话题没有解决为好,唉
Silverlight-to-WCF cross-domain exception, but clientaccesspolicy.xml is being read successfully

+0

只是为了排除故障将'http-request-headers'改为'http-request-headers =“*”',以确保请求可以通过,然后在添加限制时向后工作。如果允许所有头文件仍然没有通过,那么问题在别处。防火墙的设置可能? – Nkosi

回答

1

不知道是否有它做什么,但我有一个类似的设置,我的clientaccesspolicy.xml看起来有点不同。

<?xml version="1.0" encoding="utf-8" ?> 
<access-policy> 
    <cross-domain-access> 
    <policy> 
     <allow-from http-request-headers="SOAPAction"> 
     <domain uri="http://*"/> 
     <domain uri="https://*" /> 
     </allow-from> 
     <grant-to> 
     <resource include-subpaths="true" path="/"/> 
     </grant-to> 
    </policy> 
    </cross-domain-access> 
</access-policy> 

特别是http和https地址的拆分是不同的。 除此之外,您正试图使用​​非默认端口执行此操作,您是否在默认端口80上尝试了它?哦,在生产环境中,这些*被替换为实际的域名。

3

我记得很多年前遇到这个问题,并且解决方法有点不同,即有一种行为。考虑以下几点:

using System; 
using System.IO; 
using System.ServiceModel; 
using System.ServiceModel.Channels; 
using System.ServiceModel.Configuration; 
using System.ServiceModel.Description; 
using System.Xml; 

internal class CrossDomainServiceBehavior : BehaviorExtensionElement, IEndpointBehavior 
{ 
    private ServiceHost serviceHost; 

    public override Type BehaviorType 
    { 
     get { return typeof(CrossDomainServiceBehavior); } 
    } 

    public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) 
    { 
     if (serviceHost == null) 
     { 
      serviceHost = new ServiceHost(typeof(CrossDomainPolicyService)); 

      string address = new Uri(endpoint.Address.Uri, "/").ToString(); 
      ServiceEndpoint crossDomainEndpoint = serviceHost.AddServiceEndpoint(typeof(ICrossDomainPolicyService), new WebHttpBinding(), address); 
      crossDomainEndpoint.Behaviors.Add(new WebHttpBehavior()); 

      serviceHost.Open(); 
     } 
    } 

    public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
    { 
    } 

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) 
    { 
    } 

    public void Validate(ServiceEndpoint endpoint) 
    { 
    } 

    protected override object CreateBehavior() 
    { 
     return new CrossDomainServiceBehavior(); 
    } 
} 

internal class CrossDomainPolicyService : ICrossDomainPolicyService 
{ 
    public Message ProvideClientAccessPolicyFile() 
    { 
     XmlReader xmlReader = CreateClientAccessXml(); 
     return Message.CreateMessage(MessageVersion.None, string.Empty, xmlReader); 
    } 

    public Message ProvideCrossDomainPolicyFile() 
    { 
     XmlReader xmlReader = CreateCrossDomainXml(); 
     return Message.CreateMessage(MessageVersion.None, string.Empty, xmlReader); 
    } 

    private static XmlReader CreateClientAccessXml() 
    { 
     TextReader reader = new StringReader(@"<?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 XmlReader.Create(reader); 
    } 

    private static XmlReader CreateCrossDomainXml() 
    { 
     TextReader reader = new StringReader(@"<?xml version='1.0'?> 
                <cross-domain-policy> 
                <allow-http-request-headers-from domain='*' headers='*'/> 
                </cross-domain-policy>"); 
     return XmlReader.Create(reader); 
    } 
} 

的CrossDomainServiceBehavior需要被添加到行为上的WCF服务,它使用了CrossDomainPolicyService动态地添加跨域策略。这可以防止您必须将跨域文件添加到网站本身。

添加行为的代码(例如自托管服务):

endPoint.Behaviors.Add(new CrossDomainServiceBehavior()); 

或者在配置的WCF定义案例: 在这个例子中我将承担CrossDomainServiceBehavior的缘故是在命名空间Services.CrossDomainServiceBehavior及其所在的程序集是具有中立文化的版本1.0.0.0。它还假定你在你的服务声明webHttp上有一个绑定。

注册的行为:

<system.serviceModel> 
    <extensions> 
    <behaviorExtensions> 
     <add name="CrossDomainServiceBehavior" type="Services.CrossDomainServiceBehavior, CrossDomainServiceBehavior.AssemblyName, Version=1.0.0.0, Culture=neutral" /> 
    </behaviorExtensions> 
    </extensions> 

声明的行为:

<behaviors> 
    <endpointBehaviors> 
    <behavior name="CrossDomainServiceBehavior"> 
     <webHttp/> 
     <CrossDomainServiceBehavior/> 
    </behavior> 
    </endpointBehaviors> 
<behaviors> 

行为添加到绑定(这里例如一个叫webHttp):

<bindings> 
    <webHttpBinding> 
     <binding name="webHttp" 
     maxReceivedMessageSize="20000000" > 
      <security mode="None"> 
       <transport clientCredentialType = "None"/> 
      </security> 
     </binding> 
     <CrossDomainServiceBehavior /> 
    </webHttpBinding> 
</bindings> 

最后,将行为添加到您的服务端点,在示例中实现ISomeService:

<endpoint address="" binding="webHttpBinding" contract="Services.ISomeService" bindingConfiguration="webHttp" behaviorConfiguration="CrossDomainServiceBehavior "/>