78 votes

Renvoi de types anonymes avec Web API

Lors de l'utilisation de MVC, retour adhoc Json a été facile.

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

Je suis à la recherche de cette fonctionnalité avec la nouvelle API Web.

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

Cela déclenche une exception comme le DataContractJsonSerializer ne peut pas traiter tous les types anonymes.

J'ai remplacé cette JsonNetFormatter basé sur Json.Net. Cela fonctionne si j'utilise

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

mais je ne vois pas l'intérêt de l'utilisation de l'API Web si je ne suis pas de retour HttpResponseMessage, je serais mieux coller avec de la vanille MVC. Si j'essaie de l'utiliser:

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

Il sérialise l'ensemble de la HttpResponseMessage.

Quelqu'un peut-il me guider pour un soloution où je peux retourner les types anonymes dans un HttpResponseMessage?

86voto

carlosfigueira Points 40778

Cela ne fonctionne pas dans la version bêta, mais dans les derniers éléments (construits à partir de http://aspnetwebstack.codeplex.com ), ce sera donc probablement le chemin pour RC. Tu peux faire

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

7voto

SeriousM Points 941

vous pouvez utiliser JsonObject pour cela:

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

return new HttpResponseMessage<JsonObject>(json);
 

3voto

Leo Hernandez Points 496

Vous pouvez aussi essayer:

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

2voto

Michael Edenfield Points 15298

Vous devriez pouvoir faire en sorte que cela fonctionne si vous utilisez des génériques, car cela vous donnera un "type" pour votre type anonyme. Vous pouvez ensuite lier le sérialiseur à cela.

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

S'il n'y a pas d'attributs DataContract ou DataMebmer dans votre classe, il recourra à la sérialisation de toutes les propriétés publiques, ce qui devrait faire exactement ce que vous recherchez.

(Je n'aurai pas l'occasion de tester cela avant plus tard aujourd'hui, laissez-moi savoir si quelque chose ne fonctionne pas.)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X