locked
Problem mit veröffentlichtem Silverlight-aktivierten WCF-Dienst: "NotFound" RRS feed

  • Frage

  • Hallo,

    nachdem mein Problem beim Hinzufügen eines Silverlight-aktivierten WCF-Dienstes gelöst ist, der Service also im Debugging läuft, habe ich nun ein Problem mit dem veröffentlichten Service.

    Es handelt sich um den Service "EmailService.svc". Die Veröffentlichung auf dem Webserver funktionierte. Ein direkter Aufruf des Services im Browser, also über www.meinedomain.de/EmailService.svc, zeigt mir, dass der Service grundsätzlich funktionsfähig ist (Anzeige der Seite mit den Hinweisen zum Service).

    In der veröffentlichten Silverlight-Anwendung im Web funktioniert der Service aber nicht. Es kommt eine Fehlermeldung: NotFound.

    Ich vermute, dass der Fehler durch eine nicht korrekte Angabe der endpoint adress="..." in der Web.config verursacht wird. Meine wesentliche Frage lautet also:

    Wie gebe ich in der Web.config die endpoint adresse richtig an?

    Was muss ich dabei beachten und was kann ich dabei falsch machen?

    Die MSDN-Doku dazu ist sehr unverständlich.

    Woran kann es sonst liegen? Eine clientaccesspolicy brauche ich doch wohl nicht, weil der Service im gleichen Server-Verzeichnis wie die Silverlight-Anwendung liegt. Oder sehe ich das falsch?

    Ich bin wirklich für jeden Hinweis dankbar, weil ich ansonsten vollständig auf dem Schlauch stehe.

     

    Beste Grüße,

    Martin

    Montag, 8. November 2010 12:59

Antworten

  • Hallo Martin,

    das "Not Found" ist eine typische Meldung des Dienstes, wenn zum Beispiel eine falsche Aufruf URL (Syntax) angegeben wurde.
    Erster Test dabei ist für mich dann immer, die URL einmal manuell in den Browser einzugeben (ggf. müssen die Feed-Ansichtseinstellungen  des Browser über Internetoptionen geändert werden). Zweit häufigste Ursache ist, dass ASP.NET sich einen anderen Port nimmt. Dann musst Du den Dienst nämlich auch mit diesem (anderen) Port aufrufen. Das ganze kann immer auch mit Fiddler unterstützt werden (Du kennst es bereits).
    Bitte beachte auch ggf. die Bewertung von Forenbeiträgen - zum Beispiel dem von Dir aufgeführten Thread.



         > Wie gebe ich in der Web.config die endpoint adresse richtig an?

    - clientaccesspolicy's braucht man im Prinzip nur bei cross domain calls angeben.

    U.a. hat hier Tim Heuer - wie immer - gutes Material dazu:

    [Managing service references and endpoint configurations for Silverlight applications]
    http://timheuer.com/blog/archive/2010/04/05/managing-service-references-in-silverlight-applications-for-different-environments.aspx

    [Edit: unsere Antworten haben sich offensichtlich überschnitten] 


    ciao Frank
    Dienstag, 9. November 2010 12:19
  • HEUREKA ... ich habe das Problem gelöst. Auf dem Weg dahin habe ich unglaublich viel gelesen und gelernt. Für alle, die sich das ersparen wollen, zege ich hier die gefundene Lösung auf, die sowas von simple ist ...

    Also:

    Dem Silverlight-Projekt wird beim Hinzufügen eines Dienstverweises auf den zuvor erstellten WCF-Service von VS2010 automatisch eine Datei namens ServiceReferences.ClientConfig hinzugefügt. Damit hat es folgendes auf sich:

    Bevor ich die Lösung fand, habe ich immer nur in der Web.Config-Datei des .Web-Projekts, und dort an der Endpoint-Adresse herumgewerkelt. Das war zur Lösung meines konkreten Problems völliger Quatsch. In der Web.config des .Web-Projekts muss zwar vor dem Veröffentlichen der relative Pfad zum Service auf dem Server eingetragen werden. Das ist aber nícht das Ende vom Lied. Denn der Client, der ja nach dem Herunterladen der .xap-Datei vom Server unabhängig arbeitet, muss ja beim Aufruf des proxy die Adresse zum Service mitbekommen. Und diese Adresse bekommt der Client nicht aus der Web.config (wie denn auch, denn die liegt ja auf dem Server), sondern von der besagten Datei ServiceReferences.ClientConfig. In dieser Datei gibt es im <client>-Tag ebenfalls ein <endpoint>-Tag, und in diesem <endpoint>-Tag ein adress-Attribut.

    Das Problem ist, wenn man in der Web.config die relative Server-Adresse des Services eingibt, dann mit Rechtklick im Silverlight-Projekt auf BeispielServiceReference -> Dienstverweis aktualisieren klickt, wird nicht automatisch die Referenz in der Datei ServiceReferences.ClientConfig angepaßt. D.h., in der Datei ServiceReferences.ClientConfig steht auch nach dem Aktualisieren des Dienstverweises im <endpoint>-Tag weiterhin die Adresse des lokalen Hosts der Debug-Umgebung, also sowas wie: 

    <endpoint adress="http://localhost:49380/BeispielService.svc" ... >

    Die Lösung besteht darin, dass man vor dem endgültigen Veröffentlichen des Projekts auf dem Webserver den Wert des Attributs adress in der Datei ServiceReferences.ClientConfig auf die Server-Zieladresse des Services ändert. Und das geht am Besten so:

    Nachdem in der Web.config als Endpoint-Adresse die relative Adresse des Services auf dem Server korrekt angegeben wurde, dann der Dienstverweis (s.o.) aktualisiert wurde, sowohl das .Web-Projekt als auch das Silverlight-Projekt neu erstellt wurden, sollte das Projekt einmal mit Rechtsklick auf das .Web-Projekt -> Veröffentlichen ... auf den Webserver veröffentlicht werden. Dann ruft man den Service durch direkte Ansprache in der URL einmal direkt auf, also z.B. mit

    www.meineDomain.de/BeispielService.svc

    Wenn der Service korrekt funktioniert, was man durch den direkten Aufruf vorteilhafterweise gleich mitrpüfen kann, erscheint eine Standard-Seite mit Information zum Service. Bestandteil dieser Seite ist ein URL zum Service. Um im Beispiel zu bleiben würde dies lauten:

    http://www.meineDomain.de/BeispielService.svc?wsdl

    Auf diesen Link klickt man, und erhält dann den Inhalt die wsdl-Referenzdaten zum Service. Darin sieht man im <soap>-Tag den Wert des Attributs adress location:

    - <wsdl:service name="BeispielService">
    - <wsdl:port name="BasicHttpBinding_BeispielService" binding="tns:BasicHttpBinding_BeispielService">
     <soap:address location="http://www.meineDomain.de/BeispielService.svc" /> 
     </wsdl:port>
     </wsdl:service>
    
    

    Diesen Wert der adress location kopiert man und fügt ihn in der Datei ServiceReferences.ClientConfig im <client><endpoint>-Tag als Wert des Attributs adress ein.

    Die Projektmappe schließlich nochmals neu erstellen und dann das Projekt erneut veröffentlichen.

    Und zack ... der Service funktioniert nun auch in der Wildnis.

     

    Wie gesagt, der Weg zur Lösung dieses Problems war wirklich extrem leerreich. Ich hoffe, dass allen, die einmal vor dem gleichen Problem stehen, mit meinen Hinweisen etwas geholfen ist.

    Dienstag, 9. November 2010 12:07

Alle Antworten

  • HEUREKA ... ich habe das Problem gelöst. Auf dem Weg dahin habe ich unglaublich viel gelesen und gelernt. Für alle, die sich das ersparen wollen, zege ich hier die gefundene Lösung auf, die sowas von simple ist ...

    Also:

    Dem Silverlight-Projekt wird beim Hinzufügen eines Dienstverweises auf den zuvor erstellten WCF-Service von VS2010 automatisch eine Datei namens ServiceReferences.ClientConfig hinzugefügt. Damit hat es folgendes auf sich:

    Bevor ich die Lösung fand, habe ich immer nur in der Web.Config-Datei des .Web-Projekts, und dort an der Endpoint-Adresse herumgewerkelt. Das war zur Lösung meines konkreten Problems völliger Quatsch. In der Web.config des .Web-Projekts muss zwar vor dem Veröffentlichen der relative Pfad zum Service auf dem Server eingetragen werden. Das ist aber nícht das Ende vom Lied. Denn der Client, der ja nach dem Herunterladen der .xap-Datei vom Server unabhängig arbeitet, muss ja beim Aufruf des proxy die Adresse zum Service mitbekommen. Und diese Adresse bekommt der Client nicht aus der Web.config (wie denn auch, denn die liegt ja auf dem Server), sondern von der besagten Datei ServiceReferences.ClientConfig. In dieser Datei gibt es im <client>-Tag ebenfalls ein <endpoint>-Tag, und in diesem <endpoint>-Tag ein adress-Attribut.

    Das Problem ist, wenn man in der Web.config die relative Server-Adresse des Services eingibt, dann mit Rechtklick im Silverlight-Projekt auf BeispielServiceReference -> Dienstverweis aktualisieren klickt, wird nicht automatisch die Referenz in der Datei ServiceReferences.ClientConfig angepaßt. D.h., in der Datei ServiceReferences.ClientConfig steht auch nach dem Aktualisieren des Dienstverweises im <endpoint>-Tag weiterhin die Adresse des lokalen Hosts der Debug-Umgebung, also sowas wie: 

    <endpoint adress="http://localhost:49380/BeispielService.svc" ... >

    Die Lösung besteht darin, dass man vor dem endgültigen Veröffentlichen des Projekts auf dem Webserver den Wert des Attributs adress in der Datei ServiceReferences.ClientConfig auf die Server-Zieladresse des Services ändert. Und das geht am Besten so:

    Nachdem in der Web.config als Endpoint-Adresse die relative Adresse des Services auf dem Server korrekt angegeben wurde, dann der Dienstverweis (s.o.) aktualisiert wurde, sowohl das .Web-Projekt als auch das Silverlight-Projekt neu erstellt wurden, sollte das Projekt einmal mit Rechtsklick auf das .Web-Projekt -> Veröffentlichen ... auf den Webserver veröffentlicht werden. Dann ruft man den Service durch direkte Ansprache in der URL einmal direkt auf, also z.B. mit

    www.meineDomain.de/BeispielService.svc

    Wenn der Service korrekt funktioniert, was man durch den direkten Aufruf vorteilhafterweise gleich mitrpüfen kann, erscheint eine Standard-Seite mit Information zum Service. Bestandteil dieser Seite ist ein URL zum Service. Um im Beispiel zu bleiben würde dies lauten:

    http://www.meineDomain.de/BeispielService.svc?wsdl

    Auf diesen Link klickt man, und erhält dann den Inhalt die wsdl-Referenzdaten zum Service. Darin sieht man im <soap>-Tag den Wert des Attributs adress location:

    - <wsdl:service name="BeispielService">
    - <wsdl:port name="BasicHttpBinding_BeispielService" binding="tns:BasicHttpBinding_BeispielService">
     <soap:address location="http://www.meineDomain.de/BeispielService.svc" /> 
     </wsdl:port>
     </wsdl:service>
    
    

    Diesen Wert der adress location kopiert man und fügt ihn in der Datei ServiceReferences.ClientConfig im <client><endpoint>-Tag als Wert des Attributs adress ein.

    Die Projektmappe schließlich nochmals neu erstellen und dann das Projekt erneut veröffentlichen.

    Und zack ... der Service funktioniert nun auch in der Wildnis.

     

    Wie gesagt, der Weg zur Lösung dieses Problems war wirklich extrem leerreich. Ich hoffe, dass allen, die einmal vor dem gleichen Problem stehen, mit meinen Hinweisen etwas geholfen ist.

    Dienstag, 9. November 2010 12:07
  • Hallo Martin,

    das "Not Found" ist eine typische Meldung des Dienstes, wenn zum Beispiel eine falsche Aufruf URL (Syntax) angegeben wurde.
    Erster Test dabei ist für mich dann immer, die URL einmal manuell in den Browser einzugeben (ggf. müssen die Feed-Ansichtseinstellungen  des Browser über Internetoptionen geändert werden). Zweit häufigste Ursache ist, dass ASP.NET sich einen anderen Port nimmt. Dann musst Du den Dienst nämlich auch mit diesem (anderen) Port aufrufen. Das ganze kann immer auch mit Fiddler unterstützt werden (Du kennst es bereits).
    Bitte beachte auch ggf. die Bewertung von Forenbeiträgen - zum Beispiel dem von Dir aufgeführten Thread.



         > Wie gebe ich in der Web.config die endpoint adresse richtig an?

    - clientaccesspolicy's braucht man im Prinzip nur bei cross domain calls angeben.

    U.a. hat hier Tim Heuer - wie immer - gutes Material dazu:

    [Managing service references and endpoint configurations for Silverlight applications]
    http://timheuer.com/blog/archive/2010/04/05/managing-service-references-in-silverlight-applications-for-different-environments.aspx

    [Edit: unsere Antworten haben sich offensichtlich überschnitten] 


    ciao Frank
    Dienstag, 9. November 2010 12:19
  • Hallo Frank,

    danke für Deine Antwort.

    Wegen Deines Hinweises zur Bewertung von Forenbeiträgen. Ich wollte damit nicht offiziell einen Beitrag in meinen anderen Thread als Antwort markieren oder so. Ich weiß, dass das extrem böse aufstößt ... Aus Unwissenheit über die Geflogenheiten habe ich das mal im Expression Forum gemacht und war (wie gesagt wegen meiner Unwissenheit) total überrascht über die heftigen Abwehrreaktionen. Seither bin ich insofern ein "gebranntes Kind". Ich wollte nur darauf hinweisen, dass ich für mich das in dem anderen Thread beschriebene Problem abgehakt hatte, weil der Service im Debugging nun funktionierte. Habe in dem anderen Thread auch keinen Beitrag als Antwort markiert. Und werde auch nen Teufel tun, den markierten Beitrag als Antwort zu markieren. Das sollen andere beurteilen.

    Dein Hinweis auf die Forenregeln war und ist aber völlig in Ordnung, ich wollte nur kurz darauf antworten.

    Beim nächsten mal werde ich es präzieser formulieren, um jeden Anschein auf eine Selbstbeurteilung von eigenen Forenbeiträgen zu vermeiden.

    Vielen Dank nochmal für Deine Hilfe.

    Beste Grüße,

    Martin

    Dienstag, 9. November 2010 12:56
  • P.S.: Den Beitrag Tim Heuer, auf den Du hinweist, hatte ich auf der Suche nach einer Lösung des konkreten Problems auch gelesen und markiere deswegen Deinen Beitrag als hilfreich.
    Dienstag, 9. November 2010 12:58
  • Hallo Martin,

    nur kurz zu dem Markieren von Antworten. Du schriebst:

             > Und werde auch nen Teufel tun, den markierten Beitrag als Antwort zu markieren. Das sollen andere beurteilen.


    In diesem Forum ist es Gepflogenheit, und steht ganz klar in den Forenregeln [Quelle]:

              "Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort".

    Klar können und werden es später auch Moderatoren machen. Aber für die ist es dann nicht immer leicht und Du Du hast Dein Problem ja schon durchdrungen und weisst am besten, ob es Dir zur Lösung verholfen hat.
    Wenn Du Dir unsicher bist, ist das natürlich trotzdem ok, wenn Du das nicht machst.


    ciao Frank
    Mittwoch, 10. November 2010 13:22
  • Hallo Frank,

    danke für die Info. Das ist ein bißchen verwirrend mit dem "mark as answer". Die einen wollen es so, die anderen anders. Wie gesagt, im Expression Forum wurde ich geteert und gefedert.

    Ich würde es - eben wegen der Argumente in der Diskussion im Expression Forum mit dortigen Moderatren - so machen, dass ich Beiträge anderer, die eine Lösung für ein Problem bereitstellten, als Antwort markiere. Eigene Lösungen werde ich nicht als Antwort markieren.

    Sorry, wenn deswegen die Moderatoren ein bißchen mehr Arbeit haben. Aber das Argument ist einfach: Ich habe vielleicht eine Lösung gefunden, die mag aber technisch nicht die beste gewesen sein. Ein Moderator kann die technische Qualität eines Beirags bzw. einer potentiellen Antwort besser beurteilen.

    Beste Grüße,

    Martin

    Mittwoch, 10. November 2010 14:39