2011-01-03 9 views
2

Ich weiß nicht viel über WCF. Aber ich habe einen sehr einfachen Dienst, den ich auszuführen versuche. Mein Service-Code sieht wie folgt aus:WCF-Dienst gibt 400 Fehler bei Verwendung von WebGet zurück

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)] 
[ServiceBehavior(IncludeExceptionDetailInFaults = false)] 
[ServiceContract] 
public class MyService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "/IsValidRequest")] 
    public bool IsValidRequest() 
    { 
     return true; 
    } 
} 

Wie ich schon sagte, ein sehr einfaches Service. Wenn ich "http: // localhost: [port] /MyService.svc" in meinen Browser eingebe, sehe ich die Service-Beschreibung. "IsValidRequest" ist jedoch nicht aufgeführt, wie ich es mir vorgestellt habe (vielleicht passiert das nur mit .asmx). So oder so, wenn ich "http: // localhost: [port] /MyService.svc/IsValidRequest" in meinen Browser eingebe, wird nichts zurückgegeben. In Fiddler sehe ich, dass ich einen HTTP 400 Fehler erhalte. Es gibt jedoch nichts, was mir eine Ahnung davon gibt, was das Problem sein könnte.

Kann mir jemand helfen und mich in die richtige Richtung lenken? Vielen Dank!

+0

Welche Art von Web-Service ist es, eine Mischung aus SOAP & REST zu sein? – ShahidAzim

+0

Vielleicht ist das mein Problem. Ich möchte, dass dies ein reiner REST-Service ist. Ich dachte, so hatte ich dieses Setup. Egal, ich weiß nicht, was ich falsch mache. – user70192

+1

Wie sieht Ihre ** web.config ** aus ?? Der Abschnitt wäre von großem Interesse! Außerdem: können Sie auch den Inhalt Ihrer 'MyService.svc' Datei hochladen? ' –

Antwort

4

Verwenden Sie die folgende Konfiguration (die Namensräume ändern, um Ihren Code entsprechen)

<services> 
    <service name="WcfService1.MyService" behaviorConfiguration="GetBehavior"> 
    <endpoint address="" binding="webHttpBinding" behaviorConfiguration="WebBehavior" contract="WcfService1.MyService"> 

    </endpoint> 

    </service> 
</services> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="GetBehavior"> 

     <serviceDebug includeExceptionDetailInFaults="false"/> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="WebBehavior"> 
     <webHttp />   
    </behavior> 
    </endpointBehaviors> 

</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="false" aspNetCompatibilityEnabled="true"/> 

Ihre SVC-Datei sollte wie folgt aussehen:

<%@ ServiceHost Language="C#" Debug="true" Service="WcfService1.MyService" CodeBehind="MyService.svc.cs" %> 

enter image description here

+0

Ich hatte ein paar Tippfehler.Die Bindung muss webHttpBinding sein und Ihr Dienstname muss mit Ihrem voll qualifizierten Klassennamen übereinstimmen, der Ihren Dienst implementiert –

+0

dies funktioniert für mich unter Verwendung des Dienstcodes der bereitgestellten Operation http: //localhost/service1.svc/IsValidRequest gibt true

+1

Das OP hat gesagt, er möchte, dass dies ein REST-basierter Service ist. Warum schlagen Sie vor, dass er die Metadatenunterstützung in seinem Dienst aktiviert (serviceMetadataBehavior) - dies ist eine SOAP-Funktion –

1

an der WSDL der Suche nach der Meldung irrelevant ist, weil, wie Sie in einer Antwort auf einen Kommentar gesagt haben Sie dies wünschen um ein REST-basierter Dienst zu sein und WSDL ist ein SOAP-Konstrukt. Auf dieser Basis sollten Sie ein <serviceMetadata>-Verhalten entfernen, wenn Sie eines haben, da dies SOAP-Metadaten sind.

Um solche Probleme zu diagnostizieren, sollten Sie die Verfolgung in WCF einschalten (Ich habe einen kurzen Screencast here, der Ihnen zeigt, wie es geht). Dies sollte hervorheben, was das Problem ist, die Nachricht bei der Verarbeitung

Um den Rest Sanitär zu verdrahten, ohne einen Abschnitt in der Config für Ihren Dienst Hinzufügen fügen Sie folgendes zu Ihrer Konfigurationsdatei unter dem system.serviceModel Abschnitt

<protocolMapping> 
    <add scheme="http" binding="webHttpBinding"/> 
</protocolMapping> 
<behaviors> 
    <endpointBehaviors> 
    <behavior> 
     <webHttp/> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
+0

Das Problem ist, dass er keine Konfiguration für seinen Dienst hatte. Nicht die Metadaten sind aktiviert. Sie können nicht verfolgen, wenn Sie nicht darauf zugreifen können. Bitte lies seine Frage. –

+0

in .NET 4 er benötigt keine Konfiguration in Bezug auf den Dienst, um es als REST-Dienst verfügbar zu machen - entweder eine Protokollzuordnung für HTTP, um es WebHttpBinding zuordnen und ein Endpunktverhalten für WebHttp oder WebServiceHostFactory in seiner .svc-Datei zu verwenden mach dasselbe –

+0

Er sagt, dass er 400 Fehler bekommen habe, die ich auch bekomme, wenn ich seinen Code ausprobiere ... bis ich die Konfiguration hinzufüge. Es ist immer noch WCF, auch wenn es REST ist. Wenn Sie es nicht konfigurieren möchten, verwenden Sie MVC. –

Verwandte Themen