35 votos

Volviendo tipos anónimos con Web API

Cuando el uso de MVC, volviendo adhoc Json fue fácil.

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

Estoy buscando esta funcionalidad con la nueva API de Web.

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

Esto produce una excepción como la DataContractJsonSerializer no pueden manejar tipos anónimos.

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

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

pero no veo el punto de uso de la API de Web si no estoy volviendo HttpResponseMessage, creo que sería mejor quedarse con la vainilla MVC. Si trato y uso:

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

Se serializa toda la HttpResponseMessage.

¿Alguien puede guiarme a un soloution donde puedo volver tipos anónimos dentro de un HttpResponseMessage?

43voto

carlosfigueira Puntos 40778

Esto no funciona en la versión Beta, pero que en los últimos bits (construidos a partir de http://aspnetwebstack.codeplex.com), así que probablemente será el camino para RC. Usted puede hacer

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

2voto

SeriousM Puntos 941

usted puede utilizar JsonObject para esto:

dynamic json = new JsonObject();
json.Message = "Hello";
json.Value = 123;

return new HttpResponseMessage<JsonObject>(json);

1voto

Michael Edenfield Puntos 15298

Usted debe ser capaz de conseguir que esto funcione, si el uso de medicamentos genéricos, ya que le dará un "tipo" para su tipo anónimo. Usted puede, a continuación, enlazar el serializador.

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

Si no hay DataContract o DataMebmer atributos de su clase, va a caer de nuevo en registrar todas las propiedades públicas, que debe hacer exactamente lo que estás buscando.

(No voy a tener una oportunidad de poner a prueba esta hasta el día de hoy, hágamelo saber si hay algo que no funciona.)

1voto

Leo Hernandez Puntos 496

Usted también puede tratar de:

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());

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: