Entwickler-Ecke
WPF / Silverlight - Kommunikation mit WCF-Service (CrossDomain.xml)
FrEEzE2046 - Di 11.05.10 08:42
Titel: Kommunikation mit WCF-Service (CrossDomain.xml)
Guten Morgen,
ich habe eine Silverlight WebSite die mit einem WCF-Service kommunizieren soll. Beide - sowohl die Seite als auch der Dienst - werden über den IIS bei mir lokal gehostet.
Der Dienst stellt Methoden bereit, die mitunter Dateizugriffe auf den Server ermöglichen sollen.
Das Problem dabei ist, dass ich beim Aufruf einer solchen Methode folgende Fehlermeldung erhalte:
Zitat: |
Fehler beim Senden einer Anforderung an den URI "[...]Service.svc". Ursache ist möglicherweise, dass ohne die entsprechende domänenübergreifende Richtlinie oder mit einer nicht für SOAP-Dienste geeigneten Richtlinie domänenübergreifend auf einen Dienst zugegriffen wurde. Möglicherweise müssen Sie sich an den Besitzer des Dienstes wenden, damit eine domänenübergreifende Richtliniendatei veröffentlicht und das Senden von sich auf SOAP beziehenden HTTP-Headern zugelassen wird. Dieser Fehler kann auch durch Verwendung von internen Typen im Webdienstproxy ohne das InternalsVisibleToAtrribute-Attribut verursache werden. Weitere Details finden Sie in der inneren Ausnahme. |
Ich habe nun gelesen, dass ich dafür eine ClientAcessPolicy.xml bzw. CrossDomain.xml benötige. Ich habe versucht - beide - direkt im Root meines Virtual Directorys (welches die WebSite UND den Service enthält) zu hinterlegen; ohne Erfolg.
An anderen Stellen habe ich gelesen, dass auch zusätzlich eine Methode im Service enthalten sein muss:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| [ServiceContract] public interface IService { [OperationContract] [WebGet(UriTemplate = "ClientAccessPolicy.xml")] Message ProvidePolicyFile(); }
public class Service : IService { public System.ServiceModel.Channels.Message ProvidePolicyFile() { return Message.CreateMessage ( MessageVersion.None, "", XmlReader.Create ( File.Open ( "ClientAcessPolicy.xml", FileMode.Open ) ) ); } } |
Ich hoffe ihr könnt mir helfen. Langsam drehe ich hier nämlich durch ;-)
Kha - Di 11.05.10 10:29
Bevor wir hier ein großes Rätselraten veranstalten: Was ist denn mit
FrEEzE2046 hat folgendes geschrieben : |
Weitere Details finden Sie in der inneren Ausnahme. |
:?:
FrEEzE2046 - Di 11.05.10 12:01
Kha hat folgendes geschrieben : |
Bevor wir hier ein großes Rätselraten veranstalten: Was ist denn mit |
Wenn du mir sagst wie ich an die innere Exception ran komme.
Ich hab generell nur die Exception "Der Remoteserver hat einen Fehler verursacht" bekommen. Erst nach hinzufügen von
C#-Quelltext
1:
| WebRequest.RegisterPrefix("http://", System.Net.Browser.WebRequestCreator.ClientHttp); |
im Konstruktor meiner MainPage, habe ich diese qualifiziertere Meldung erhalten.
Wie ich an die innere Exception komme ... keine Ahung.
Kha - Di 11.05.10 12:18
FrEEzE2046 hat folgendes geschrieben : |
Wie ich an die innere Exception komme ... keine Ahung. |
Im Exception-Dialog von VS gibt es unten einen Link "View Detail...", über den du das Exception-Objekt inspizieren kannst.
FrEEzE2046 - Di 11.05.10 12:24
Kha hat folgendes geschrieben : |
FrEEzE2046 hat folgendes geschrieben : | Wie ich an die innere Exception komme ... keine Ahung. | Im Exception-Dialog von VS gibt es unten einen Link "View Detail...", über den du das Exception-Objekt inspizieren kannst. |
Ähm,
der Dienst wird vom IIS gehostet. Ich kann den so nicht debuggen. Selbstverständlich habe ich den Dienst zum debuggen vorher in einer Konsolenanwendung laufen lassen, aber da funktioniert halt alles.
Hier mein Aufrufcode:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| private void button_Click(object sender, RoutedEventArgs e) { this._client.SendStatementCompleted += new EventHandler<AsyncCompletedEventArgs>(this._SendStatementCompleted); this._client.SendStatementAsync(this.textBox.Text); }
private void _SendStatementCompleted(object sender, AsyncCompletedEventArgs e) { if (e.Error == null) MessageBox.Show("Statement send"); else { Exception exc = e.Error; do { MessageBox.Show(exc.Message); } while ((exc = exc.InnerException) != null); } } |
Wenn ich die Page selbst über den DevelopmentServer hoste, dann ist immer die InnerException1 = "" und die InnerException2 = "Sicherheitsfehler"
Zitat: |
Sicherheitsfehler
bei System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse |
Kha - Di 11.05.10 13:26
FrEEzE2046 hat folgendes geschrieben : |
Ähm,
der Dienst wird vom IIS gehostet. Ich kann den so nicht debuggen. |
Zum Debuggen würde ich ihn eher zusammen mit der Webseite von VS hosten lassen, aber die Exception wird doch wohl sowieso im
Client ausgelöst, oder :nixweiss: ?
Eigentlich solltest du hier überhaupt keine Policy benötigen, da ja beide mit
localhost in der gleichen Domain sitzen :gruebel: .
FrEEzE2046 hat folgendes geschrieben : |
Ich habe versucht - beide - direkt im Root meines Virtual Directorys (welches die WebSite UND den Service enthält) zu hinterlegen; ohne Erfolg. |
Wenn ich das richtig verstanden habe, müssen sie im Root der
Domain liegen, also
localhost/ClientAcessPolicy.xml. Im Notfall könntest du mit Fiddler überprüfen, wo sich die Silverlight-App so umschaut.
FrEEzE2046 - Di 11.05.10 14:38
Kha hat folgendes geschrieben : |
Eigentlich solltest du hier überhaupt keine Policy benötigen, da ja beide mit localhost in der gleichen Domain sitzen :gruebel: |
Tja, eigentlich nicht. Dachte ich mir eben auch so.
Kha hat folgendes geschrieben : |
aber die Exception wird doch wohl sowieso im Client ausgelöst, oder :nixweiss: ? |
Nein, der WCF Service löst die Exception aus.
Ich greife - wie gesagt - mit der Methode auf Dateien des Servers (in dem Fall eben der localhost) zu. Ich denke, dass das das Problem ist.
Kha hat folgendes geschrieben : |
Wenn ich das richtig verstanden habe, müssen sie im Root der Domain liegen, also localhost/ClientAcessPolicy.xml. |
mmmh, würde das Sinn machen? Wenn ich mehrere Verzeichnis über verschiedene Ports hosten will ... ach ne geht ja mit dem IIS 6.0 eh nicht.
Mein Verzeichnis sieht so aus:
XML-Daten
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| <localhost> <WebSites> <Standardwebsite> <MeineWebSite> <Entry name="Service.svc"/> <Entry name="MeineWebSite.aspx"/> <Entry name="crossdomain.xml"/> </MeineWebSite> </Standardwebsite> </WebSites> </localhost> |
Kha - Di 11.05.10 14:53
FrEEzE2046 hat folgendes geschrieben : |
Nein, der WCF Service löst die Exception aus. |
Ahja, wie am Stacktrace
System.Net.Browser.ClientHttpWebRequest.InternalEndGetResponse deutlich zu erkennen. Wie soll denn ein Service eine Exception werfen, wenn schon die Verbindung zu ihm scheitert?
FrEEzE2046 hat folgendes geschrieben : |
mmmh, würde das Sinn machen? |
Keine Ahnung, aber es ist nun einmal so ;) .
FrEEzE2046 - Di 11.05.10 14:56
Kha hat folgendes geschrieben : |
Keine Ahnung, aber es ist nun einmal so ;) . |
Wie lege ich denn im IIS eine Datei im Root-Verzeichnis ab? Sehe da auf den ersten Blick keinen Weg.
Ich denke jetzt auch, dass die Verbindung schon scheitert, da auch eine Methode, die einfach nichts macht, die gleiche Fehlermeldung produziert. In einer Konsolenanwendung kann ich den Dienst aber nutzen. Woran kann das noch liegen?
EDIT:
Okay, jetzt geht's. Man muss dem link zur svc ein "?wsdl" (Web Services Description Language), sonst nimmt er die URI wohl nicht so ...
EDIT2:
Das einzige was nervt, ist, dass die AsyncCompletedEventMethode manchmal mehrfach gecalled wird ... woran auch immer das liegen mag.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!