web-dev-qa-db-fra.com

Mettre le contenu dans l'objet HttpResponseMessage?

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.

142
praetor

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.

52
praetor

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.

171
Jim O'Neil

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.

108

Pour tout objet en T, vous pouvez faire:

return Request.CreateResponse<T>(HttpStatusCode.OK, Tobject);
37
ScubaSteve

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" ) };
32
Simon Mattes

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")
    {
    }
}
15
bytedev

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.

4
Adam Cox

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);
0
Steven W. H.