Autor Beitrag
core2
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Mi 30.09.09 12:46 
Hi@all,

ich will mich in die WCF-Technologie einarbeiten und habe zu anfang einfach mal eine ganz simple Silverlight-App mit einem Textblock im Grid erstellt. Die Silverlight-App soll nun beim laden auf einen ebenfalls zu testzwecken erst mal sehr simplen WCF-Service zugreifen und die Methode HalloWorld ausführen. diese liefert dann einfach nur den String "Hallo World" zurück, welcher in den Textblock gesetzt werden soll.

Wenn ich das Projekt nun in Visual Studio ausführe klappt alles ohne Probleme. Visual Studio startet den ASP.Development Server welcher den WCF-Service stellt und die Silverlight-App. kann nun darauf zugreifen.

Wenn ich aber das Projekt auf meinem IIS veröffentliche geht es nicht mehr. Beim starten der Silverlight-App. bekomme ich nur eine Fehlermeldung, dass der WCF-Service nicht erreicht werden kann?

Was mach ich denn falsch?

coreException
Einloggen, um Attachments anzusehen!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mi 30.09.09 18:55 
:welcome:

Zitat:
Please see the inner exception for more details.

Schonmal versucht ;) ? Im "Web"-Tab der Projekteigenschaften kannst du auswählen, direkt den IIS zu debuggen.

_________________
>λ=
SSC streezer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

WinXP, Vista Ultimate
C# (VS 05 n' 08), PHP
BeitragVerfasst: Do 01.10.09 08:09 
du musst den service starten und der service sollte dann die applikation starten - so ists zumindest bei mir... muss einfach konfiguriert werden.

_________________
>> Swiss Soldiers Clan << visit us
core2 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Do 01.10.09 17:05 
Hi Leute,

Ich danke Euch erst mal für eure Hilfe.

Ich denke, dass ich bereits bei der Erstellung der App. irgend etwas falsch mache. Ich hab Euch deshalb mal kurz in Stichpunkten aufgelistet, wie ich die App erstelle.
  1. start Microsoft Visual Web Developer 2008 Express Edition
  2. Datei -> neues Projekt -> Silverlight -> Silverlight-Anwendung (name TestApp)
  3. Name des Webprojekts (TestApp.Web) / Typ des neuen Webprojekts ASP.Net-Webanwendungsprojekt -> ok
  4. Rechts-Click im Projektmappen-Exporer auf das Projekt TestApp.Web -> Hinzufügen -> neues Element -> Silverlight -> Silverlight-fähiger WCF-Dienst
  5. Name des WCF-Dienstes (TestWCFService.svc) -> ok
  6. TestWCFService.svc.cs öffnen
  7. in die Klassen TestWCFService wird folgende Methode eingefügt
    ausblenden C#-Quelltext
    1:
    2:
    3:
    4:
    5:
    [OperationContract]
    public string HalloWorld()
    {
         return "Hallo World";
    }

  8. Rechts-Click auf die Datei TestWCFService.svc -> In Browser anzeigen (der Browser öffnent sich und zeigt, dass der Sevice korrekt arbeitet)
  9. Rechts-Click im Projektmappen-Exporer auf das Projekt TestApp -> Dienstverweis hinzufügen
  10. auf den "ermitteln"-Button Klicken -> in der Textbox für die Adresse erscheint nun die des eben erstellten WCF-Services, wobei der Port abweichen kann (localhost:1064/TestWCFService.svc)
  11. Name des Namespace (TestWCFServiceReference) -> ok
  12. Nun die Datei MainPage.xaml im Projekt TestApp öffnen und in das Grid die folgende Zeile einfügen
    ausblenden XML-Daten
    1:
    <TextBlock Name="TestTextBlock" Loaded="messageLoaded"/>					


  13. Nun die Datei MainPage.xaml.cs im Projekt TestApp öffnen und in die Klasse MainPage die folgenden Zeilen einfügen


    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:
    // wird ausgeführt, wenn der Textblock geladen wurde
    private void messageLoaded(object sender, RoutedEventArgs e)
    {
        try
        {
            TestWCFServiceReference.TestWCFServiceClient svc = new TestWCFServiceReference.TestWCFServiceClient();
             svc.HalloWorldCompleted += new EventHandler<TestWCFServiceReference.HalloWorldCompletedEventArgs>(svc_HalloWorldCompleted);
             svc.HalloWorldAsync();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.ToString());
        }
    }

    // Füllt den von der HallWorld-Methode zurückgegebenen String in den TextBlock
    void svc_HalloWorldCompleted(object sender, TestWCFServiceReference.HalloWorldCompletedEventArgs e)
    {
        if (e.Error == null)
        {
            this.TestTextBlock.Text = e.Result;
        }
        else
        {
            MessageBox.Show(e.Error.Message + "\n" + e.Error.InnerException.Message);
        }
    }


  14. Rechts-Click im Projektmappen-Exporer auf das Projekt TestApp -> neu Erstellen
  15. Rechts-Click im Projektmappen-Exporer auf das Projekt TestApp.Web -> neu Erstellen
  16. Wenn nun auf Debugging starten Button gedrückt wird, wird das Projekt ohne Probleme ausgeführt.


Aber:


  • Rechts-Click im Projektmappen-Exporer auf das Projekt TestApp -> in Browser anzeigen -> besagte Exception
  • Erstellen -> TestApp.Web veröffentlichen -> Zielspeicherort -> localhost/TestApp -> veröffentlichen -> Browser öffenen -> TestApp ausführen (localhost/TestApp/TestAppTestPage.html) -> Exception


Ich scheine noch irgend etwas zu vergessen, Aber was. :(
Wisst Ihr da vieleicht weiter?

Moderiert von user profile iconChristian S.: Liste repariert
core2 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 02.10.09 19:35 
Hat denn keiner von Euch eine Idee? :(
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 02.10.09 20:06 
Du hast bereits zwei Antworten bekommen, aber beide ignoriert. Meine Frage hast du nicht beantwortet und SSC hat dir wahrscheinlich sogar die Lösung gesagt: localhost:1064/TestWCFService.svc ist nur gültig, während der VS-Debug-Server läuft, nach dem Veröffentlichen auf den IIS sollte sich die URL ändern.

_________________
>λ=
core2 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 03.10.09 11:36 
Hi Kha,

sorry, aber die hab ich nicht ignoriert. Sie haben mich nur leider nicht weitergebracht. Ich gehe, wie du, auch davon aus, dass die URL für den Endpunkt geändert werden muss, aber das will bei mir nicht funktionieren. Wenn ich URL in der ServiceReferences.ClientConfig allein ändere hab ich immer noch den selben Fehler. Wenn ich aber die URL im gesammten Projekt (also in allen Dateien) ändere bekomme ich einen Laufzeitfehler in irgend einer der System-Klassen von .NET selbst.

Daher hätte ich besser mal schreiben sollen, dass ich dies bereits erfolglos verucht hatte. Sorry. Wenn das aber die Lösung für mein Problem zu sein scheint, dann sag mit doch bitte, was ich dabei falsch mache bzw. wie du genau dabei vorgehst.

Danke übrigens für das WELCOME.

core
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 03.10.09 12:21 
Wie du das mit der URL korrigieren musst, müsste ich mir nachher selbst erstmal anschauen, aber wahrscheinlich wird es so funktionieren: Erst veröffentlichst du den Web-Service auf deinen lokalen IIS, dann referenzierst du im SL-Projekt den veröffentlichten Web-Service.

Edit: Ok, so funktioniert es bei mir, ausgehend von deiner Beschreibung:

Zusätzlich musste ich noch das und das (ServiceModelReg.exe) ausführen.

_________________
>λ=
core2 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 03.10.09 15:39 
Hi Kha,

danke für deine Hilfe. Nur vorweg gesagt: Störe Dich bitte nicht, wenn die Bezeichnungen vom Projekt und WCF-Service gegenüber meinem vorherigen Beiträgen etwas abweichen. Die Projekte unterscheiden sich nur geringfügig. Macht also keinen Unterschied. Ich tüftel eben schon eine Weile daran rum und erstelle immer mal wieder neue Projekte, weil ich die Alten bei meiner Suche nach einer Lösung teilweise völlig unbrauchbar mache und dann nicht mehr zum laufen kriege.
Nun gut. Ich hab alles so gemacht, wie du es beschrieben hast:

- ASP.NET-Projekt aud dem IIS veröffentlicht (beinhaltet natürlich auch die Silverlight-App.)

IIS

- Danach hab ich mich versichert, dass der WCF-Service auch steht und korrekt arbeitet

WCF-Test-Client

wie Du dem bild entnehmen kannst, schein alles korrekt zu laufen. der service arbeite auf dem server also einwandfrei. Soweit, sogut! Nun hab ich folgendes gemacht:

- Service-Reference im Silverlight-Projekt abgeändert von "http://localhost:1064/HelloWorld.svc" zu "http://localhost/wcf-service-test/HelloWorld.svc"

Referenze

- beim ermitteln findet auch das Silverlight-Projekt den WCF-Service und auch beim compilieren gibt es keine Exception.

Wenn ich alles nun abermals veröffentliche und im Browser öffne, klappt es leider immer noch nicht. :cry: Ich verstehe es einfach nicht??? Was vergesse ich denn bzw. mache ich falsch? Da der WCF-Service ja korrekt arbeitet muss der Fehler wohl im Silverlight-Projekt liegen, oder? Da der Computername, localhost un die IP des Computers in den Pfaden das selbe sind (macbook, 192.168.2.3, localhost), kann das keinen negativen Einfluss haben. ich habs aber auch schon mit alles auf localhost bzw. IP bzw. Computername versucht, aber das ändert auch nichts. Was bleibt da nun noch?


Danke im voraus für alles, was mich weiter bringt.

core
Einloggen, um Attachments anzusehen!
core2 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 03.10.09 15:47 
Hier ist übrigens nochmal die Exception (etwas ausfürlicher)

Exception
Einloggen, um Attachments anzusehen!
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 03.10.09 16:29 
user profile iconcore2 hat folgendes geschrieben Zum zitierten Posting springen:
Da der Computername, localhost un die IP des Computers in den Pfaden das selbe sind (macbook, 192.168.2.3, localhost), kann das keinen negativen Einfluss haben.
Oh doch ;) . Die Anfrage geht nach dem Screenshot an macbook. Alles außer localhost sieht Silverlight aber anscheinend als fremden Server an und fragt dann berechtigterweise nach einer Cross Domain Policy.
Fragt sich nur, warum dort auf einmal "macbook" steht, in dem Screenshot darüber steht ja das richtige "localhost". Kannst du in der .ClientConfig-Datei noch einmal nachschauen, ob das dort wirklich drinsteht?

_________________
>λ=
core2 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 03.10.09 17:21 
Hi Kha,

wow, du hattest recht. nachdem ich in der ServiceReferences.ClientConfig die Adresses in address="http://localhost/wcf-service-test/HelloWorld.svc" umgenannt habe und die WCF-Reference ebenfalls in diese umbenannte, das Projekt abermals konfiguriert/veröffentlicht habe, ging es im Browser.

Allerdings nur unter der URL "http://localhost/wcf-service-test/SilverlightHelloWorldTestPage.aspx." Wenn ich nun versuche die Silverlight-App. unter der URL "http://macbook/wcf-service-test/SilverlightHelloWorldTestPage.aspx" oder "http://192.168.2.3/wcf-service-test/SilverlightHelloWorldTestPage.aspx" auszuführen, wird diese zwar geladen, gibt aber die besagt Exception zurück.

Nun möchte ich aber, dass die Silverlight-App. nicht nur von dem Computer ausgeführt werden kann, auf der sie im IIS liegt, sondern von allen im Netz. Folglich müßte dann doch die URL die IP des IIS-Web-Servers bzw. dessen Namen und nicht localhost enthalten, damit auch andere Rechner die App. finden.

Du sagtest, wenn statt localhost die IP bzw. der Rechnername für die URL der Web-Services-Reference verwendet werden, ist die Nutzung einer Cross-Domain-Policy unumgänglich. Hab ich das so richtig verstanden?

Damit hatte ich es aber bereits schonmal versucht, allerdings ohne Erfolg. Wie muss diese den aussehen bzw. wo genau im Verzeichnis auf den IIS liegen, damit es funzt?

Ich hatte sie ins Stammverzeichnis der App. auf dem IIS gepackt und sie sah folgendermaßen aus:

clientaccesspolicy.xml:
ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
<?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>

Liegt da möglicherweise mein Fehler? Nach meiner Recerche gibt es da auch doch die crossdomain.xml. Weist du was es damit auf sich hat? Welche von beide brauche ich? Wie muss diese aussehen und wo genau im Verzeichnis liegen? Muss ich dann die Referenze im der Silverlight-App. auf die "URL http://macbook/wcf-service-test/HelloWorld.svc" bzw "http://192.168.2.3/wcf-service-test/HelloWorld.svc" ändern oder diese bei localhost belassen?

Danke für deine Hilfe. Ich denke wir stehen kurz vor der Lösung meines Problems

core
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 03.10.09 19:06 
Aah, mir fällt erst jetzt auf, wie pingelig SL eigentlich ist :D .
Von macbook kommst du auf keinen localhost-Service, weil er es nicht als Same-Domain-Call erkennt.
Von localhost auf macbook allerdings auch nicht, aus dem gleichen Grund.

Nimm also macbook als Endpoint und rufe die SL-App über macbook auf und alle sind glücklich :) .

_________________
>λ=
core2 Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 03.10.09 19:36 
Hi Kha,

ich danke dir. Es hat funktioniert. Echt toll, dass du dir die Zeit genommen hast, mir zu helfen und bist zur Lösung der Problems auch durchzuhalten. :lol:

Danke!Danke!Danke!