把内容放在HttpResponseMessage对象中?

几个月前,微软决定改变HttpResponseMessage类。 之前,您可以简单地将数据types传递给构造函数,然后返回带有该数据的消息,但现在不再了。

现在,您需要使用Content属性来设置消息的内容。 问题是它是HttpContenttypes,我似乎无法find一种方法来转换string,例如,HttpContent。

有谁知道如何处理这个问题? 非常感谢。

对于string来说,最快捷的方法是使用StringContent构造函数

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

对于其他常见场景,还有许多其他HttpContent类的后代 。

您应该使用Request.CreateResponse创build响应:

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

您可以将对象不仅传递给CreateResponse,而且会根据请求的Accept头将其序列化。 这可以避免手动select格式化程序。

显然,新的方法是在这里详细介绍:

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

引用Henrik的话,

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

所以基本上,必须创build一个ObjectContenttypes,这显然可以作为一个HttpContent对象返回。

对于任何T对象,你可以这样做:

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

您可以创build自己的专用内容types。 例如一个用于Json内容,另一个用于Xml内容(然后将它们分配给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") { } } 

最简单的单线解决scheme是使用

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

对于序列化的JSON内容:

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

受到Simon Mattes的回答的启发,我需要满足IHttpActionResult ResponseMessageResult所需的返回types。 同样使用nashawn的JsonContent,我结束了…

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

查看nashawn对JsonContent的回答。

毫无疑问,你是正确的弗洛林。 我正在研究这个项目,发现这段代码:

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

可以replace为:

 response.Content = new StringContent(string product);