2009-06-03 3 views
38

Hintergrund
Ich habe ASMX Dienstleistungen in der Vergangenheit Web erstellt und haben den Service aus dem Web-Browser und Ajax GET-Anfragen in der Lage für den Zugriff auf die Adresse Konvention:
MyService.asmx/MyMethod?Param=xxxErstellen einer Web-Service-Arbeit WCF mit GET-Anforderungen

Ich habe gerade begonnen, WCF zu verwenden und einen neuen Webdienst in meinem ASP.NET-Projekt erstellt. Es erstellt eine Datei mit der Erweiterung .svc wie MyService.svc.

Aktuelle Situation
Ich kann den Dienst mit dem WcfTestClient, die mit VS2008 kommt konsumieren. Ich bin auch in der Lage, meinen eigenen WCF-Klienten zu schaffen, indem ich entweder einen Dienstverweis in einem anderen Projekt hinzufüge oder die Befehlszeile svcutil.exe benutze, um den proxy und die config-Akte zu erzeugen.

Das Problem
Wenn ich versuche, den Dienst von einem Browser MyService.svc/MyMethod?MyParam=xxx mit zu verwenden, erhalte ich eine leere Seite ohne Fehler.

Was ich
versucht habe, habe ich hinzugefügt, die bereits ein basicHttpBinding zum web.config und machte es HttpGetEnabled im Verhalten Konfiguration. Ich habe auch das Attribut [WebGet(UriTemplate = "MyMethod?MyParam={MyParam}")] zu meinem Betriebsvertrag hinzugefügt.

Ich habe bereits die Informationen in diesem anderen Stack-Überlauf Frage folgt:
REST/SOAP EndPoints for a WCF Service

Allerdings habe ich entweder eine leere Seite oder einen HTTP-Fehler 404 erhalten, nachdem diese Schritte. Es gibt nichts besonderes an dem Code. Ich nehme nur einen String als Parameter und gebe "Hello xxx" zurück. Dies ist eine grundlegende "Hello WCF World" Proof-of-Concept-Typ-Sache.


UPDATE - Hier ist der entsprechende Code

[ServiceContract] 
public interface IMyService 
{ 
    [WebGet(UriTemplate = "MyMethod/MyParam={MyParam}")] 
    [OperationContract] 
    string MyMethod(string MyParam); 
} 

Web.Config - system.serviceModel Abschnitt

<system.serviceModel>  
    <behaviors> 
     <serviceBehaviors>   
      <behavior name="MyServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <services> 
     <service behaviorConfiguration="MyServiceBehavior" name="MyService"> 
     <endpoint address="" 
         binding="wsHttpBinding" contract="IMyService" /> 
     <endpoint address="MyService.svc" 
         binding="basicHttpBinding" contract="IMyService" /> 
     <endpoint address="mex" 
         binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services>  
</system.serviceModel> 

Antwort

43

Ein Blick auf Ihre web.config Servicemodel Abschnitt, kann ich sehen, dass Sie eine webHttpBinding hinzufügen müssen und eine endPointBehavior zuordnen, die webHttpGet enthält.

Ihr Betrieb Vertrag korrekt ist. Hier ist, wie Ihr system.serviceModel Config Abschnitt um aussehen sollte für Sie in der Lage sein, den Dienst von einer GET HTTP-Anforderung zu konsumieren.

<system.serviceModel>  
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyServiceBehavior"> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="true"/>   
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="WebBehavior"> 
      <webHttp /> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors>  
    <services>  
     <service behaviorConfiguration="MyServiceBehavior" name="MyService"> 
     <endpoint address="ws" binding="wsHttpBinding" contract="IMyService"/> 
     <endpoint address="" behaviorConfiguration="WebBehavior" 
        binding="webHttpBinding" 
        contract="IMyService"> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services>  
</system.serviceModel> 

Achten Sie darauf, eine andere Adresse zu Ihrem wsHttpBinding Endpunkt zuweisen, da Sie sonst einen Fehler erhalten, dass Sie zwei Endpunkte auf dem gleichen URI zu hören.

Eine weitere Option ist die Adresse leer in der wsHttpBinding, zu verlassen, aber eine andere Adresse an den webHttpBinding Dienst zuweisen. Dies ändert jedoch auch Ihre GET-Adresse.

Wenn Sie beispielsweise die Adresse als "asmx" zuweisen, würden Sie Ihren Dienst mit der Adresse "MyService.svc/asmx/MyMethod?MyParam=xxxx" aufrufen.

+0

Ich denke, ich brauchte nur das endPointBehavior hinzuzufügen. Es hat wie ein Zauber funktioniert. Vielen Dank. – ichiban

5

Die normalen WCF-Anfragen sind immer Anfragen SOAP - Sie werden nicht in der Lage sein, Damit dies nur mit Ihrem Browser möglich ist, benötigen Sie den WCF Testclient.

Es gibt ein Add-on für WCF namens WCF REST Starter Kit (das auch in WCF 4.0 mit .NET 4.0 enthalten sein wird), mit dem Sie HTTP-Befehle GET/POST/PUT/DELETE zum Abfragen von WCF-Diensten und dergleichen verwenden können . Sie müssen Ihre Dienste jedoch speziell für REST schreiben - Sie können SOAP und REST nicht für denselben Serviceaufruf verwenden.

Marc

4

Wie marc_s says kann die REST Starter Kit helfen, aber Sie sollten sich auch bewusst sein, dass .NET 3.5 Unterstützung für REST-Services hat sich direkt in sie. Es ist nicht so vollständig wie das, was Sie mit dem Starter-Kit tun können, aber es ist nützlich.

Das System funktioniert so, dass Sie ein [WebGet] Attribut auf Ihrem Betrieb setzen in der URL, um anzuzeigen, wo die verschiedenen Parameter kommen sollten:

[WebGet(UriTemplate = "helloworld/{name}")] 
string Helloworld(string name); 

this portal für jede Menge Informationen.

Hinweis, können Sie den gleichen Service wie sowohl SOAP und REST ausgesetzt haben, wenn Sie mehrere Endpunkte/Bindungen in der Konfiguration angeben.

+0

ich das WebGet Attribut in meinem Betrieb Vertrag haben, wie ich in meiner Frage erwähnen. Ich habe den UriTemplate-Teil in meiner Frage vermisst, aber so habe ich ihn in meinem Code. Hast du das selbst ausprobiert? – ichiban

+0

Ja, so bauen wir unsere REST-Dienste. –

+0

das UriTemplate funktioniert für mich. – Cheeso

Verwandte Themen