Autor Beitrag
FrEEzE2046
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Di 11.05.10 08:42 
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:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 11.05.10 10:29 
Bevor wir hier ein großes Rätselraten veranstalten: Was ist denn mit
user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
Weitere Details finden Sie in der inneren Ausnahme.
:?:

_________________
>λ=
FrEEzE2046 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Di 11.05.10 12:01 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 11.05.10 12:18 
user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Di 11.05.10 12:24 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 11.05.10 13:26 
user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
Ä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: .

user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Di 11.05.10 14:38 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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.


user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<localhost>
  <WebSites>
    <Standardwebsite>
      <MeineWebSite>
        <!--Stellt die Service Informationen bereit-->
        <Entry name="Service.svc"/>
        <Entry name="MeineWebSite.aspx"/>
        <Entry name="crossdomain.xml"/>
      </MeineWebSite>
    </Standardwebsite>
  </WebSites>
</localhost>
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 11.05.10 14:53 
user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
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?

user profile iconFrEEzE2046 hat folgendes geschrieben Zum zitierten Posting springen:
mmmh, würde das Sinn machen?
Keine Ahnung, aber es ist nun einmal so ;) .

_________________
>λ=
FrEEzE2046 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 109

Windows 98, 2000, XP Pro, Vista Ultimate 32 & 64 Bit, Windows 7 Beta 64 Bit
C/C++, C# (VS 2008 TeamSystem) - Delphi (Delphi 5) - Java (Eclipse)
BeitragVerfasst: Di 11.05.10 14:56 
user profile iconKha hat folgendes geschrieben Zum zitierten Posting springen:
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.