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.

1voto

meandmycode Punkte 16547

Haben Sie versucht . wenn Sie dies über den IE verwenden, können Sie vielleicht den Datenverkehr sehen, den Silverlight verursacht, z. B. welche Cross-Policy-Dateien gesucht werden?

1voto

Jeppen Punkte 374

Ich habe meine Internet-Explorer-Einstellungen geändert. Die Website läuft auf einem internen Webserver, also habe ich sie in die Liste der vertrauenswürdigen Sites des Internet Explorers aufgenommen. (Extras->Internetoptionen->Sicherheit->Seiten).

Dann änderte ich die Sicherheitsstufe und aktivierte domänenübergreifend. Erledigt, funktioniert, aber ich brauchte eine Weile, um die Lösung zu finden.

Beste, Jeppen

1voto

Avicena00 Punkte 345

Sie müssen sich der Situation bewusst sein, dass, wenn Sie auf Ihren Dienst in Ihrem Projekt verweisen, die Datei "Reference.ClienConfig" erstellt wird und es gibt:

    **

<endpoint address="http://localhost:57675/Servis.asmx" binding="basicHttpBinding"
            bindingConfiguration="ServisSoap" contract="ServiceReference1.ServisSoap"
            name="ServisSoap" />

**

Vergewissern Sie sich, dass Ihre Seite immer noch denselben Port verwendet (hier zum Beispiel 57675). Standardmäßig erhält Ihr localhost einen zufälligen Port, daher müssen Sie ihn auf eine statische und nicht auf eine dynamische Nummer ändern. (Klicken Sie mit der rechten Maustaste auf asp.net project/Tab Web/Specific port /type number Hoffentlich hilft es

0voto

ScottG Punkte 10193

Ich hatte ein ähnliches Problem und durch Hinzufügen einer ServiceHostFactory wurde es behoben. Die domänenübergreifende Richtliniendatei allein hat das Problem nicht gelöst.

class MyHostFactory : ServiceHostFactory
{
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        MyHost customServiceHost =
          new MyHost(serviceType, new Uri("[Your URL goes here]",UriKind.Absolute));

        return customServiceHost;
    }
}

class MyHost : ServiceHost
{
    public MyHost(Type serviceType, params Uri[] baseAddresses)   base(serviceType, baseAddresses)
    { }

    protected override void ApplyConfiguration()
    {
        base.ApplyConfiguration();
    }
}

Sie müssen auch Factory="MyHostFactory" in den Tag einfügen, der Ihren Dienst definiert

0voto

Nitin Chaudhari Punkte 1467

Das Problem könnte sein, dass Ihr Entwicklungsserver nicht in der Lage ist, die XML-Datei bereitzustellen. Versuchen Sie Folgendes: Machen Sie die Datei explizit über WebGet verfügbar

[ServiceContract]
    public interface ICrossDomainService
    {
        [OperationContract]
        [WebGet(UriTemplate = "ClientAccessPolicy.xml")]
        Message ProvidePolicyFile();
    }

und dann kann die ProvidePolicyFile()

public System.ServiceModel.Channels.Message ProvidePolicyFile()
        {
            FileStream filestream = File.Open(@"ClientAcessPolicy.xml", FileMode.Open);
            // Either specify ClientAcessPolicy.xml file path properly
            // or put that in \Bin folder of the console application
            XmlReader reader = XmlReader.Create(filestream);
            System.ServiceModel.Channels.Message result = Message.CreateMessage(MessageVersion.None, "", reader);
            return result;
        }

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