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.
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.
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.
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.
Für jedes T-Objekt können Sie Folgendes tun:
return Request.CreateResponse<T>(HttpStatusCode.OK, Tobject);
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" ) };
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")
{
}
}
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.
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);