25 Stimmen

Silverlight Crossdomain

Ich habe eine Menge Links zu MSDN und "funktioniert auf meinem Rechner!" Antworten gesehen, so möchte ich meine Frage mit den genauen Schritten zu duplizieren, was ich tue zu fragen. Da wir einen bereits existierenden Webservice verwenden, frage ich mit dem Kontext, dass ein Webservice außerhalb meines Projekts gehostet wird, im Gegensatz zu vielen der Tutorials und Videos online. Also hier geht:

*** Erstellen Sie ein neues ASP.NET-Webservice-Projekt.

Es wird mit einer bestehenden Service.asmx-Datei geliefert, die eine "HelloWorld"-Webmethode bereitstellt.

Ansicht im Browser, drücken Sie die Schaltfläche "Aufrufen". Es sollte funktionieren und die Zeichenkette "Hello World" zurückgeben.

Auf meinem Rechner lautet die URL: " http://localhost:15511/WebSite5/Service.asmx "

*** Starten Sie eine neue Instanz von Visual Studio und erstellen Sie ein Silverlight-Webanwendungsprojekt.

*** Kleben Sie dort eine einzelne Schaltfläche mit einem Ereignis-Handler, um den Webdienst aufzurufen. Ich persönlich nuke das Grid und verwenden Sie eine einfache StackPanel. zB.

<UserControl x:Class="SilverlightApplication1.Page"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="400" Height="300">
    <StackPanel>
        <Button Click="Button_Click">
            <Button.Content>
                <TextBlock Text="Test"/>
            </Button.Content>
        </Button>
    </StackPanel>
</UserControl>

Fügen Sie den Webverweis, die using-Anweisung und den Event-Handler für den Button_Click hinzu:

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        ServiceSoapClient client = new ServiceSoapClient();
        client.HelloWorldCompleted += (object s, HelloWorldCompletedEventArgs ea) => { 
            MessageBox.Show(ea.Result); 
        };
        client.HelloWorldAsync();
    }

Ausführen und natürlich scheitert es an domänenübergreifenden Problemen. Also fügen Sie als nächstes die clientaccesspolicy.xml Datei mit folgendem Inhalt in das Stammverzeichnis Ihrer Webanwendung, die den Dienst hostet:

<?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 include-subpaths="true" path="/"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

Dies sollte die Dinge öffnen, da es einen Platzhalter für Header, uris und Ressourcen hat, richtig?

  • Führen Sie es erneut aus und Sie erhalten eine Fehlermeldung:

Beim Versuch, eine Anfrage an die URI '' zu stellen, ist ein Fehler aufgetreten. http://localhost:15511/WebSite5/Service.asmx '. Dies könnte darauf zurückzuführen sein, dass versucht wird, auf einen Dienst domänenübergreifend zuzugreifen, ohne dass eine geeignete domänenübergreifende Richtlinie vorhanden ist, oder dass die Richtlinie für SOAP-Dienste ungeeignet ist. Möglicherweise müssen Sie sich mit dem Eigentümer des Dienstes in Verbindung setzen, um eine domänenübergreifende Richtliniendatei zu veröffentlichen und sicherzustellen, dass sie das Senden von SOAP-bezogenen HTTP-Headern erlaubt.

Daher die Frage: Gibt es ein Geheimnis für die Clientaccesspolicy-Datei? Man könnte es alternativ mit der crossdomain.xml versuchen, aber das ergibt ein ähnliches Ergebnis.

9voto

Socardo Punkte 510

Ich habe dieses Problem (SL v5.0 und Visual Studio 2010) begegnet, was es für mich behoben ist, dass ich in die Silverlight-Projekteigenschaften >> Silverlight Registerkarte ging und wählte "Require erhöhtes Vertrauen bei der Ausführung in-Browser"

5voto

Donn Felker Punkte 9394

Ich hatte das gleiche Problem schon ein paar Mal. In der Vergangenheit habe ich das Problem gelöst, indem ich die Web App zum Starten verwendet habe, aber es sieht so aus, als hätten Sie das bereits getan.

Mein Beitrag zu diesem Thema: http://www.donnfelker.com/silverlight-cross-domain-issue/

4voto

Deven Punkte 41

Stellen Sie sicher, dass Sie die Datei clientaccesspolicy.xml im Stammverzeichnis des IIS-Webverzeichnisses ablegen, z. B.

C:\Inetpub\wwwroot\clientaccesspolicy.xml

Dadurch wird sichergestellt, dass sie direkt unter http:///clientaccesspolicy.xml zugänglich ist.

Ich hatte den gleichen Fehler und konnte ihn mit den oben genannten Schritten beheben.

2voto

sacredfaith Punkte 818

Etwas, das bei mir funktionierte, begann mit dem, was ich in den Silverlight-Foren fand ici . Sie fragte im Wesentlichen, ob ich überhaupt erhalten. zu meiner clientaccesspolicy.xml oder crossdomain.xml von localhost (http://localhost/clientaccesspolicy.xml). Als ich versuchte, dorthin zu navigieren, konnte ich das nicht, also habe ich einfach den Code für beide Dateien gefunden (auch in dem oben erwähnten Thread) und den Code aus diesen Dateien in mein inetpub kopiert \wwwroot\ Verzeichnis (ich habe sie mit Notepad++ geöffnet). Der merkwürdige Teil war der Code hat sich überhaupt nicht geändert und trotzdem funktioniert es! Hoffentlich hilft das jemandem! Das war äußerst seltsam.

clientaccesspolicy.xml

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

crossdomain.xml

<?xml version="1.0"?>
<!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd">
<cross-domain-policy>
  <allow-http-request-headers-from domain="*" headers="*"/>
</cross-domain-policy>

Seid gesegnet!

-sf

2voto

Jeff Yates Punkte 59874

Client-Konfiguration

Vielleicht ist Ihr ServiceReferences.ClientConfig für Ihren Silverlight-Client auf die falsche URL verweist?

Überprüfen Sie auch den Speicherort Ihrer domänenübergreifenden Richtliniendatei. Diese MSDN-Artikel hat weitere Informationen.

Silverlight lokal ausführen

Zusätzlicher Hinweis für die lokale Ausführung von Silverlight (z. B. Vista Sidebar). Wie berichtet in dieser Blogeintrag , "Silverlight kann keinen Netzwerkanbieter verwenden, wenn es lokal ausgeführt wird". Die Abhilfe besteht darin, in dieser Situation Javascript als Schnittstelle zum Webdienst zu verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X