returns remarks method documentacion description comentarios c# json asp.net-web-api json.net

c# - remarks - Devolver tipos anónimos con la API web



remarks c# (8)

Al usar MVC, devolver Adhoc Json fue fácil.

return Json(new { Message = "Hello"});

Estoy buscando esta funcionalidad con la nueva API web.

public HttpResponseMessage<object> Test() { return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK); }

Esto arroja una excepción ya que DataContractJsonSerializer no puede manejar tipos anónimos.

He reemplazado esto con este JsonNetFormatter basado en Json.Net . Esto funciona si uso

public object Test() { return new { Message = "Hello" }; }

pero no veo el sentido de usar Web API si no HttpResponseMessage , sería mejor que me quedara con vanilla MVC. Si intento y uso:

public HttpResponseMessage<object> Test() { return new HttpResponseMessage<object>(new { Message = "Hello" }, HttpStatusCode.OK); }

Serializa todo el HttpResponseMessage .

¿Alguien puede guiarme hacia una solución en la que pueda devolver tipos anónimos dentro de un HttpResponseMessage ?


Debería poder hacer que esto funcione si usa genéricos, ya que le dará un "tipo" para su tipo anónimo. A continuación, puede vincular el serializador a eso.

public HttpResponseMessage<T> MakeResponse(T object, HttpStatusCode code) { return new HttpResponseMessage<T>(object, code); }

Si no hay atributos DataContract o DataMebmer en su clase, recurrirá a la serialización de todas las propiedades públicas, que deberían hacer exactamente lo que está buscando.

(No tendré la oportunidad de probar esto hasta más tarde, avíseme si algo no funciona).



Esta respuesta puede llegar un poco tarde, pero a partir de hoy, WebApi 2 ya está disponible y ahora es más fácil hacer lo que usted quiere, simplemente debe hacer:

public object Message() { return new { Message = "hello" }; }

y a lo largo de la tubería se serializará a xml o json según las preferencias del cliente (el encabezado Accept ). Espero que esto ayude a cualquiera a tropezar con esta pregunta


Esto no funciona en la versión Beta, pero sí en los últimos bits (compilados a partir de http://aspnetwebstack.codeplex.com ), por lo que probablemente sea el camino para RC. Tu puedes hacer

public HttpResponseMessage Get() { return this.Request.CreateResponse( HttpStatusCode.OK, new { Message = "Hello", Value = 123 }); }


Podría usar un ExandoObject . (agregue using System.Dynamic; )

[Route("api/message")] [HttpGet] public object Message() { dynamic expando = new ExpandoObject(); expando.message = "Hello"; expando.message2 = "World"; return expando; }


Puede encapsular un objeto dinámico al devolver un objeto como

public class GenericResponse : BaseResponse { public dynamic Data { get; set; } }

y luego en WebAPI; haz algo como:

[Route("api/MethodReturingDynamicData")] [HttpPost] public HttpResponseMessage MethodReturingDynamicData(RequestDTO request) { HttpResponseMessage response; try { GenericResponse result = new GenericResponse(); dynamic data = new ExpandoObject(); data.Name = "Subodh"; result.Data = data;// OR assign any dynamic data here;// response = Request.CreateResponse<dynamic>(HttpStatusCode.OK, result); } catch (Exception ex) { ApplicationLogger.LogCompleteException(ex, "GetAllListMetadataForApp", "Post"); HttpError myCustomError = new HttpError(ex.Message) { { "IsSuccess", false } }; return Request.CreateErrorResponse(HttpStatusCode.OK, myCustomError); } return response; }


También puedes probar:

var request = new HttpRequestMessage(HttpMethod.Post, "http://leojh.com"); var requestModel = new {User = "User", Password = "Password"}; request.Content = new ObjectContent(typeof(object), requestModel, new JsonMediaTypeFormatter());


puedes usar JsonObject para esto:

dynamic json = new JsonObject(); json.Message = "Hello"; json.Value = 123; return new HttpResponseMessage<JsonObject>(json);