2016-07-08 4 views
4

Ich habe einen Restful Dienst, der diese OperationContractFehler 415, während meine Wcf-Dienst testen

[OperationContract] 
[WebInvoke(Method = "POST", 
    ResponseFormat = WebMessageFormat.Json, 
    BodyStyle = WebMessageBodyStyle.Wrapped, 
    UriTemplate = "json")] 
Response JSONData(Request request); 

hat und auf diese Weise konfiguriert

<?xml version="1.0"?> 
<configuration> 

    <system.web> 
    <compilation debug="true" targetFramework="4.0" /> 
    </system.web> 

    <system.serviceModel> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="BasicHttpBinding_IService" closeTimeout="01:01:00" 
      openTimeout="01:01:00" receiveTimeout="01:10:00" sendTimeout="01:01:00" 
      allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
      messageEncoding="Text" textEncoding="utf-8" transferMode="Streamed" 
      useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" 
      maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      <security mode="None"> 
      <transport clientCredentialType="None" proxyCredentialType="None" 
       realm="" /> 
      <message clientCredentialType="UserName" algorithmSuite="Default"/> 
      </security> 
     </binding> 
     </basicHttpBinding> 

     <webHttpBinding> 
     <binding name="WebHttpBinding_IService" closeTimeout="01:01:00" openTimeout="01:01:00" 
      receiveTimeout="01:10:00" sendTimeout="01:01:00" allowCookies="false" 
      bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
      maxBufferSize="2147483647" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" 
      transferMode="Streamed" useDefaultWebProxy="true"> 
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" 
      maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      <security mode="None" /> 
     </binding> 
     <binding name="webHttpBindingXML"/> 
     <binding name="webHttpBindingJSON"/> 
     </webHttpBinding> 
    </bindings> 

    <services> 
     <service name="SearchService.SearchService" behaviorConfiguration="ServiceBehaviour"> 
     <!-- Service Endpoints --> 
     <!-- Unless fully qualified, address is relative to base address supplied above --> 
     <endpoint address ="" binding="webHttpBinding" bindingConfiguration="WebHttpBinding_IService" contract="SearchService.ISearchService" behaviorConfiguration="web"> 
      <!-- 
       Upon deployment, the following identity element should be removed or replaced to reflect the 
       identity under which the deployed service runs. If removed, WCF will infer an appropriate identity 
       automatically. 
      --> 
     </endpoint> 
     </service> 
    </services> 

    <behaviors> 
     <serviceBehaviors> 
     <behavior name="ServiceBehaviour"> 
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="true"/> 
      <!-- To receive exception details in faults for debugging purposes, set the value below to true. Set to false before deployment to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="web"> 
      <webHttp/> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 

    <standardEndpoints> 
     <webHttpEndpoint> 
     <standardEndpoint 
      automaticFormatSelectionEnabled="true" 
      helpEnabled="true" /> 
     </webHttpEndpoint> 
    </standardEndpoints> 
    </system.serviceModel> 

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"/> 
    </system.webServer> 

</configuration> 

Das Request-Objekt auf diese Weise gebildet wird,

[DataContract] 
public class Query 
{ 
    [DataMember] 
    public string name { get; set; } 

    [DataMember] 
    public string birthDate { get; set; } 
} 

[DataContract] 
public class Input 
{ 
    [DataMember] 
    public Query query { get; set; } 

    [DataMember] 
    public string login_username { get; set; } 

    [DataMember] 
    public string login_password { get; set; } 
} 

[DataContract] 
public class Request 
{ 
    [DataMember] 
    public Input input { get; set; } 
} 

Ich habe einen kleinen Client erstellt, um diese Abfrage zu testen, und ich habe es auch getestet mit WCFTestClient und wor ks gut. Wenn ich versuche, über Fiddler darauf zuzugreifen, bekomme ich einen 415 Unsupported Media Type Fehler.

Ich habe versucht, dies auf die folgende Weise

POST, http://localhost:8080/HostDevServer/SearchService.svc/json, HTTP/1.1 

User-Agent: Fiddler 
Content-Type: application/json;charset=UTF-8 
Host: localhost:8080 
Content-Length: 368 

{ "input": { "login_password": "pass", "login_username": "login name", "query": { "birthDate": "", "name": "robert" } } } 

Ich habe auch versucht, diesen Service bereitstellen und sehen, ob Fiedler darauf zugreifen dann wäre in der Lage, aber es kam noch mehr, weil jetzt statt verwirrend ein 415 I des Erhaltens bekam eine 400 Beschwerde über 'Reference to an object not set to an instance of the object.' und die kleine Kommandozeilen-Client, den ich erstellt habe, würde sich über There was no endpoint listening at den Standort meines Dienstes beschweren.

Meine Frage ist, ist etwas falsch mit meiner Konfigurationsdatei, oder habe ich die Fiddler-Anfrage in der falschen Weise komponiert? Wenn ja, wie kann ich das beheben, damit ich normal auf meinen Service zugreifen kann?

Antwort

3

ich sehe, dass Sie BodyStyle = WebMessageBodyStyle.Wrapped

verwenden Dies bedeutet, dass Sie die aktuellen Daten mit dem Namen der Variablen durch Ihre OperationContract erwartet wickeln müssen. Kurz gesagt sollte diese

{ "response": { "input": { "login_password": "pass", "login_username": "login name", "query": { "birthDate": "", "name": "robert" } } } } 

funktionieren, wenn Sie den Körper Inhalt behalten möchten, wie dann schlage ich vor, Sie Bare anstelle von Wrapped für den Körper Stil.

+1

@Tim danke für die Bearbeitung, manchmal schreiben meine Hände Zeug auf eigene Faust. – ealiaj