2011-09-01 8 views
10

He estado trabajando para obtener un servicio WCF RESTful para aceptar un JSON como parámetro y devolver algo de JSON.WCF BodyStyle WrappedRequest no funciona para el param entrante de JSON?

Esta es mi servicio:

[OperationContract] 
    [WebInvoke(
     Method="POST", 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json, 
     UriTemplate = "Authenticate")] 
    public AuthResponse Authenticate(AuthRequest data) 
    { 
     AuthResponse res = new AuthResponse(); 
     if (data != null) 
     { 
      Debug.WriteLine(data.TokenId); 
      res.TokenId = new Guid(data.TokenId); 
     } 
     return res; 
    } 

Lo anterior fijará datos ser nula cuando paso {AuthRequest: {TokenId = "algunos GUID"}}.

Si configuro el BodyStyle del método como Bare, entonces datos están configurados correctamente, pero debo eliminar {AuthRequest} del JSON (lo cual no quiero hacer en realidad). ¿Hay alguna forma de que WrappedRequests funcione con {AuthRequest: {TokenId = "some guid"} como JSON?

Gracias.

Respuesta

20

El nombre de la envoltura no es el parámetro tipo, pero el nombre del parámetro . Si lo envía como {"data":{"TokenId":"some guid"}} debería funcionar.

O si desea utilizar un nombre que no sea el nombre del parámetro, puede utilizar el atributo [MessageParameter]:

[OperationContract] 
[WebInvoke(
    Method="POST", 
    BodyStyle = WebMessageBodyStyle.WrappedRequest, 
    RequestFormat = WebMessageFormat.Json, 
    ResponseFormat = WebMessageFormat.Json, 
    UriTemplate = "Authenticate")] 
public AuthResponse Authenticate([MessageParameter(Name = "AuthRequest")] AuthRequest data) 
+1

Respuesta perfecta :) No hay idea de que sea el nombre del parámetro, no el tipo, y la opción de nombre del parámetro del mensaje es bastante buena de saber. – adamwtiko

+0

¡Salvó mi día! Casi la misma pregunta, pero no encontré la suya solo por diferentes palabras clave: http://stackoverflow.com/questions/39048349/how-to-create-json-to-match-serialize-to-datacontract-in-wcf -rest-service/39088864 # 39088864 – NealWalters

3

Ésta es una respuesta tardía, pero espero que ayude a alguien.

También estaba tratando de hacer funcionar un servicio web "POST" de JSON, pero su parámetro siempre se estableció como nulo. Olvídate de tratar de deserializar cualquier información JSON, ¡nunca había nada allí para trabajar!

public string CreateNewSurvey(string JSONdata) 
{ 
    if (JSONdata == null) 
     return "JSON received: NULL, damn."; 
    else 
     return "You just sent me: " + JSONdata; 
} 

Mi servicio web GET funcionó muy bien, pero este "POST" me volvía loco.

Mi solución, curiosamente, fue cambiar el tipo de parámetro de cadena de a corriente.

public string CreateNewSurvey(Stream JSONdataStream) 
{ 
    StreamReader reader = new StreamReader(JSONdataStream); 
    string JSONdata = reader.ReadToEnd(); 

    // Finally, I can add my JSON deserializer code in here! 

    return JSONdata; 
} 

... y en mi web.config ...

[OperationContract(Name = "createNewSurvey")] 
    [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, UriTemplate = "createNewSurvey")] 
    string CreateNewSurvey(Stream JSONdata); 

Con esto en su lugar, por último, mi aplicación para iPad podría llamar a mi servicio WCF. ¡Yo era un hombre feliz! Espero que esto ayude.

+0

Digamos que quieres llamar a esto usando POSTMAN, SoapUI ¿cómo lo harías? – user1429595

+0

@ Mike Gledhill ... y en mi web.config ...? :(IService.cs –

Cuestiones relacionadas