Il y a plusieurs mois, Microsoft a décidé de modifier la classe HttpResponseMessage. Auparavant, vous pouviez simplement passer un type de données au constructeur, puis renvoyer le message avec ces données, mais plus maintenant.
Maintenant, vous devez utiliser la propriété Content pour définir le contenu du message. Le problème est qu'il est de type HttpContent et que je n'arrive pas à trouver un moyen de convertir une chaîne, par exemple en HttpContent.
Est-ce que quelqu'un sait comment traiter ce problème? Merci beaucoup.
Apparemment, la nouvelle façon de le faire est détaillée ici:
http://aspnetwebstack.codeplex.com/discussions/350492
Pour citer Henrik,
HttpResponseMessage response = new HttpResponseMessage();
response.Content = new ObjectContent<T>(T, myFormatter, “application/some-format”);
Donc, fondamentalement, il faut créer un type ObjectContent, qui peut apparemment être renvoyé sous forme d'objet HttpContent.
Pour une chaîne en particulier, le moyen le plus rapide consiste à utiliser le constructeur StringContent
response.Content = new StringContent("Your response text");
Il existe un certain nombre de descendants supplémentaires de la classe HttpContent pour d'autres scénarios courants.
Vous devez créer la réponse en utilisant Request.CreateResponse :
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest, "Error message");
Vous pouvez transmettre des objets, pas seulement des chaînes, à CreateResponse, qui les sérialisera en fonction de l'en-tête Accept de la demande. Cela vous évite de choisir manuellement un formateur.
Pour tout objet en T, vous pouvez faire:
return Request.CreateResponse<T>(HttpStatusCode.OK, Tobject);
La solution monoligne la plus simple consiste à utiliser
return new HttpResponseMessage( HttpStatusCode.OK ) {Content = new StringContent( "Your message here" ) };
Pour le contenu JSON sérialisé:
return new HttpResponseMessage( HttpStatusCode.OK ) {Content = new StringContent( SerializedString, System.Text.Encoding.UTF8, "application/json" ) };
Vous pouvez créer vos propres types de contenu spécialisé. Par exemple, un pour le contenu Json et un pour le contenu XML (puis assignez-les simplement à HttpResponseMessage.Content):
public class JsonContent : StringContent
{
public JsonContent(string content)
: this(content, Encoding.UTF8)
{
}
public JsonContent(string content, Encoding encoding)
: base(content, encoding, "application/json")
{
}
}
public class XmlContent : StringContent
{
public XmlContent(string content)
: this(content, Encoding.UTF8)
{
}
public XmlContent(string content, Encoding encoding)
: base(content, encoding, "application/xml")
{
}
}
Inspiré par la réponse de Simon Mattes, je devais satisfaire le type de retour requis de ResponseMessageResult par IHttpActionResult. Également en utilisant JsonContent de nashawn, je me suis retrouvé avec ...
return new System.Web.Http.Results.ResponseMessageResult(
new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
{
Content = new JsonContent($"{JsonConvert.SerializeObject(contact, Formatting.Indented)}")
});
Voir la réponse de nashawn pour JsonContent.
Nul doute que vous avez raison Florin. Je travaillais sur ce projet et j'ai constaté que ce morceau de code:
product = await response.Content.ReadAsAsync<Product>();
Peut être remplacé par:
response.Content = new StringContent(string product);