¿Poner contenido en el objeto HttpResponseMessage?

Hace varios meses, Microsoft decidió cambiar la clase HttpResponseMessage. Antes, simplemente podía pasar un tipo de datos al constructor y luego devolver el mensaje con esa información, pero ya no.

Ahora, necesita usar la propiedad Content para establecer el contenido del mensaje. El problema es que es de tipo HttpContent, y parece que no puedo encontrar la forma de convertir una cadena, por ejemplo, en HttpContent.

¿Alguien sabe cómo lidiar con este problema? Muchas gracias.

Para una cadena específicamente, la forma más rápida es usar el constructor StringContent

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

Hay una cantidad adicional de descendientes de clase HttpContent para otros escenarios comunes.

Debe crear la respuesta utilizando Request.CreateResponse :

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

Puede pasar objetos no solo cadenas a CreateResponse y los serializará según el encabezado Accept de la solicitud. Esto le evita elegir manualmente un formateador.

Aparentemente, la nueva forma de hacerlo se detalla aquí:

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

Para citar a Henrik,

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

Entonces, básicamente, uno tiene que crear un tipo ObjectContent, que aparentemente puede devolverse como un objeto HttpContent.

Para cualquier objeto T que puedas hacer:

 return Request.CreateResponse(HttpStatusCode.OK, Tobject); 

La solución más simple de una sola línea es usar

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

Para contenido JSON serializado:

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

Puede crear sus propios tipos de contenido especializado. Por ejemplo, uno para el contenido de Json y otro para el contenido de Xml (luego simplemente asignenlos a 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") { } } 

Inspirado por la respuesta de Simon Mattes, necesitaba satisfacer IHttpActionResult, el tipo de devolución requerido de ResponseMessageResult. También usando el JsonContent de nashawn, terminé con …

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

Ver la respuesta de nashawn para JsonContent.

No hay duda de que estás en lo correcto Florin. Estaba trabajando en este proyecto y encontré este código:

 product = await response.Content.ReadAsAsync(); 

Podría ser reemplazado por:

 response.Content = new StringContent(string product);