wake-up-neo.com

Inhalt in das HttpResponseMessage-Objekt einfügen?

Vor einigen Monaten hat Microsoft beschlossen, die Klasse HttpResponseMessage zu ändern. Zuvor konnten Sie einfach einen Datentyp an den Konstruktor übergeben und dann die Nachricht mit diesen Daten zurückgeben, jedoch nicht mehr.

Jetzt müssen Sie die Content-Eigenschaft verwenden, um den Inhalt der Nachricht festzulegen. Das Problem ist, dass es vom Typ HttpContent ist und ich keine Möglichkeit finde, eine Zeichenfolge zu konvertieren, zum Beispiel in HttpContent.

Kann jemand mit diesem Problem umgehen? Vielen Dank.

142
praetor

Anscheinend wird der neue Weg hier detailliert beschrieben:

http://aspnetwebstack.codeplex.com/discussions/350492

Um Henrik zu zitieren,

HttpResponseMessage response = new HttpResponseMessage();

response.Content = new ObjectContent<T>(T, myFormatter, “application/some-format”);

Grundsätzlich muss also ein ObjectContent-Typ erstellt werden, der anscheinend als HttpContent-Objekt zurückgegeben werden kann.

52
praetor

Für einen String ist der schnellste Weg die Verwendung des Konstruktors StringContent

response.Content = new StringContent("Your response text");

Es gibt eine Reihe von Nachkommen der HttpContent-Klasse für andere häufige Szenarien.

171
Jim O'Neil

Sie sollten die Antwort mit Request.CreateResponse erstellen:

HttpResponseMessage response =  Request.CreateResponse(HttpStatusCode.BadRequest, "Error message");

Sie können Objekte nicht nur Strings an CreateResponse übergeben, sondern sie werden anhand des Accept-Headers der Anforderung serialisiert. Dies erspart Ihnen die manuelle Auswahl eines Formatierers.

108

Für jedes T-Objekt können Sie Folgendes tun:

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

Die einfachste einzeilige Lösung ist die Verwendung

return new HttpResponseMessage( HttpStatusCode.OK ) {Content =  new StringContent( "Your message here" ) };

Für serialisierte JSON-Inhalte:

return new HttpResponseMessage( HttpStatusCode.OK ) {Content =  new StringContent( SerializedString, System.Text.Encoding.UTF8, "application/json" ) };
32
Simon Mattes

Sie können Ihre eigenen speziellen Inhaltstypen erstellen. Zum Beispiel einen für Json-Inhalt und einen für XML-Inhalt (weisen Sie ihn dann einfach dem HttpResponseMessage.Content zu):

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

Inspiriert durch die Antwort von Simon Mattes musste ich den erforderlichen Rückgabetyp von ResponseMessageResult von IHttpActionResult erfüllen. Auch mit Nashawns JsonContent endete ich mit ...

        return new System.Web.Http.Results.ResponseMessageResult(
            new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.OK)
            {
                Content = new JsonContent($"{JsonConvert.SerializeObject(contact, Formatting.Indented)}")
            });

Siehe nashawns Antwort für JsonContent.

4
Adam Cox

Zweifellos haben Sie recht Florin. Ich arbeitete an diesem Projekt und stellte fest, dass dieses Stück Code:

product = await response.Content.ReadAsAsync<Product>();

Könnte ersetzt werden durch:

response.Content = new StringContent(string product);
0
Steven W. H.