Domänenübergreifender Fehler Silverlight+WCF




cross-domain cross-domain-policy (2)

Nicht sicher, ob es etwas damit zu tun hat, aber ich habe ein ähnliches Setup und meine clientaccesspolicy.xml sieht ein bisschen anders aus.

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

Vor allem das Teilen von http- und https-Adressen ist anders. Außerdem versuchen Sie dies mit einem nicht standardmäßigen Port zu tun, haben Sie es am Standard-Port 80 versucht? oh und in der Produktionsumgebung werden diese * durch den tatsächlichen Domain-Namen ersetzt.

Ich habe die meisten Themen gelesen, die sich mit domänenübergreifenden Fehlern befassen, und kann immer noch nicht funktionieren. Auf der Website lade ich das Silverlight-Modul, das mit WCF Webservice kommuniziert. Auf localhost funktioniert es einwandfrei, kein Fehler ist aufgetreten.

Ich habe Webservice gehostet auf http: // localhost: 50283 und in demselben Ordner, auf den Port 50283 verweist, habe ich clientaccesspolicy.xml gefunden, das wie folgt aussieht

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

Ich habe clientaccesspolicy.XML fast überall einschließlich \ wwwroot platziert, aber das hat keine Wirkung gebracht. Ich kann auf clientaccesspolicy.xml sowohl lokal als auch auf einem anderen Computer innerhalb desselben Netzwerks zugreifen ( http: // computerIP: 50283 / clientaccesspolicy.xml zeigt den Inhalt an).
Ich habe versucht, den Fehler abzufangen, um mehr Details über die Natur des Fehlers herauszufinden, aber Fiddler führt keinen Fehler ein, der einzige Browser tut es. Buchstäblich habe ich alles versucht und immer noch keine Veränderung. Hat jemand ein ähnliches Problem gehabt und könnte einige Hinweise geben, wo ich nach einer Lösung suchen sollte?

Ich stieß auf ähnliches Thema ohne Lösung, leider
Silverlight-to-WCF-domänenübergreifende Ausnahme, aber clientaccesspolicy.xml wird erfolgreich gelesen


Ich erinnere mich, dass ich vor vielen Jahren damit angefangen habe, es etwas anders zu lösen, nämlich mit einem Verhalten. Folgendes berücksichtigen:

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);
    }
}

Das CrossDomainServiceBehavior-Objekt muss den Verhaltensweisen in Ihrem WCF-Dienst hinzugefügt werden, und es verwendet den CrossDomainPolicyService zum dynamischen Hinzufügen der domänenübergreifenden Richtlinie. Dies verhindert, dass Sie die Cross-Domain-Datei zur Website selbst hinzufügen müssen.

Hinzufügen des Verhaltens aus Code (z. B. mit selbst gehosteten Diensten):

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

Oder im Falle von WCF-Definitionen in Config: Für dieses Beispiel nehme ich an, dass das CrossDomainServiceBehavior im Namespace Services.CrossDomainServiceBehavior ist und die Assembly, in der es sich befindet, in der Version 1.0.0.0 mit einer neutralen Kultur ist. Es nimmt auch an, dass Sie eine Bindung an Ihre Dienstdeklaration namens WebHttp haben.

Registrieren des Verhaltens:

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

Deklarieren Sie das Verhalten:

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

Fügen Sie der Bindung das Verhalten hinzu (hier als Beispiel webHttp genannt):

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

Abschließend fügen Sie das Verhalten Ihrem Dienstendpunkt hinzu, hier in Beispiel eins, das ISomeService implementiert:

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