it-swarm.com.de

Silverlight Crossdomain

Ich habe viele Links zu MSDN gesehen und "funktioniert auf meinem Rechner!" Antworten, so möchte ich meine Frage mit den genauen Schritten fragen, um zu wiederholen, was ich tue. Da wir einen bereits vorhandenen Webservice verwenden, frage ich im Zusammenhang mit dem Hosting eines Webservice außerhalb meines Projekts, im Gegensatz zu vielen Online-Tutorials und Videos. So geht es also:

*** Erstellen Sie ein neues ASP.NET-Webserviceprojekt.

Es wird mit einer vorhandenen Service.asmx-Datei geliefert, die eine Webmethode "HelloWorld" verfügbar macht.

Im Browser anzeigen, klicken Sie auf die Schaltfläche "Invoke". Es sollte funktionieren und die Zeichenfolge "Hello World" zurückgeben.

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

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

*** Stecken Sie dort eine Schaltfläche mit einem Event-Handler, um den Webdienst aufzurufen. Ich persönlich nuke das Grid und verwende ein einfaches StackPanel. z.B.

<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 die Webreferenz mithilfe des Anweisungs- und Ereignishandlers für 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();
    }

Run und natürlich sprengt es sich wegen Crossdomain-Problemen. Fügen Sie als Nächstes die Datei clientaccesspolicy.xml mit dem folgenden Eintrag zum Stammverzeichnis Ihrer Webanwendung hinzu, 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 eine Wildcard für Header, Uris und Ressourcen hat, richtig?

  • Laufen Sie noch einmal und Sie erhalten einen Fehler: 

Beim Versuch, eine Anforderung an die URI ' http: // localhost: 15511/WebSite5/Service.asmx ' zu stellen, ist ein Fehler aufgetreten. Dies kann daran liegen, dass versucht wurde, domänenübergreifend auf einen Dienst zuzugreifen, ohne dass eine ordnungsgemäße domänenübergreifende Richtlinie vorhanden ist, oder eine für SOAP -Dienste ungeeignete Richtlinie. Möglicherweise müssen Sie sich an den Eigentümer des Diensts wenden, um eine domänenübergreifende Richtliniendatei zu veröffentlichen und sicherzustellen, dass SOAP-bezogene HTTP-Header gesendet werden können.

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

25
t3rse

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

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

5
Donn Felker

Dieses Problem ist aufgetreten (SL v5.0 und Visual Studio 2010). Für mich wurde behoben, dass ich auf die Silverlight-Projekteigenschaften >> Registerkarte Silverlight zugegriffen habe und "Erhöhte Vertrauenswürdigkeit beim Ausführen des Browsers" ausgewählt hat.

7
Socardo

Stellen Sie sicher, dass Sie die Datei clientaccesspolicy.xml im Stammverzeichnis von IIS im Webverzeichnis ablegen, z.

C:\Inetpub\wwwroot\clientaccesspolicy.xml

Dadurch wird sichergestellt, dass direkt unter http: ///clientaccesspolicy.xml darauf zugegriffen werden kann

Ich habe den gleichen Fehler erhalten und es mit den obigen Schritten behoben.

4
Deven

Etwas, das für mich funktioniert hat, begann mit dem, was ich in den Silverlight-Foren gefunden habe hier . Es fragte im Wesentlichen, ob ich überhaupt könnte get an meine clientaccesspolicy.xml oder crossdomain.xml von localhost (http: //localhost/clientaccesspolicy.xml). Als ich versuchte, dort zu navigieren, konnte ich den Code für beide nicht finden (auch innerhalb des oben genannten Threads) und den Code in diese Dateien kopieren, die sich in meinem inetpub\wwwroot\-Verzeichnis befinden (ich öffnete sie mit Notepad ++). Der seltsame Teil war  Der Code hat sich überhaupt nicht geändert und doch funktioniert es! Hoffe das hilft jemandem! Das war extrem 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>

Gesegnet sein!

-sf

2
sacredfaith

Client-Konfiguration

Möglicherweise verweist Ihr ServiceReferences.ClientConfig für Ihren Silverlight-Client auf die falsche URL? 

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

Lokal ausgeführtes Silverlight

Zusätzlicher Hinweis zum lokalen Ausführen von Silverlight (z. B. Vista-Sidebar). Wie in diesem Blogeintrag berichtet , "Silverlight kann bei lokaler Ausführung keinen Netzwerkanbieter verwenden." Die Problemumgehung besteht darin, Javascript zu verwenden, um sich in dieser Situation mit dem Webdienst zu verbinden.

2
Jeff Yates

Sie müssen sich der Situation bewusst sein, dass, wenn Sie sich auf Ihren Service in Ihrem Projekt beziehen, die Datei "Reference.ClienConfig" erstellt wird und Folgendes angezeigt wird:

    **

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

**

Stellen Sie sicher, dass Ihre Seite immer noch denselben Port verwendet (hier ist beispielsweise 57675). Standardmäßig erhält Ihr localhost einen zufälligen Port. Daher müssen Sie ihn in eine statische Zahl und nicht in eine dynamische Zahl ändern. (Klicken Sie mit der rechten Maustaste auf asp.net project/Tab Web/Bestimmte Port-/Typnummer . Hoffe, es hilft

1
Avicena00

Haben Sie versucht, fiddler zu verwenden, wenn Sie dies über IE verwenden, können Sie möglicherweise sehen, dass der Verkehr, den Silverlight verursacht, z. B. nach welchen Cross-Policy-Dateien es sucht?

1
meandmycode

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

Dann habe ich die Sicherheitsstufe geändert und domänenübergreifend aktiviert. Fertig, funktioniert aber hat mich gedauert, um die Lösung zu finden.

Am besten, Jeppen

1
Jeppen

Das Problem könnte sein, dass Ihr Entwicklungsserver die XML-Datei nicht bereitstellen kann. Versuchen Sie dies - machen Sie sie explizit über WebGet verfügbar

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

und dann kann das ProvidePolicyFile () sein

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;
        }
0
Nitin Chaudhari

Ich bin auf so etwas gestoßen und habe eine ServiceHostFactory hinzugefügt, die mein Problem behoben hat. Die domänenübergreifende Richtliniendatei allein hat es nicht behoben. 

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 dem Tag hinzufügen, das Ihren Service definiert

0
ScottG

Es hat in meinem PC erfolgreich funktioniert, Sie können Ihre platzieren 

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>

sowohl Ihr Projektverzeichnis als auch Ihr Webservices-Stammverzeichnis.

Ich war mit demselben Problem konfrontiert und brauchte mehr als 3 Tage, um das Problem herauszufinden. Wenn ich den Internet-Cloud-Service WCF von einer Silverlight-App angerufen habe, die auf einem anderen Webserver gehostet wird, werden nur domänenübergreifende Fehler angezeigt. Nachdem ich einige Posts durchgesehen habe, habe ich das Problem nicht gelöst, sondern sogar gekreuzt -domain.xml und clientaccesspolice.xml-Dateien im Dienststammverzeichnis. Ich versuche es stattdessen mit http://example.com . Ich ändere es einfach in sicher https: // example.com und es hat einfach gut funktioniert. Die domänenübergreifenden Fehler verschwinden. Service wurde ohne Probleme aufgerufen.

0
jose lopes