将内容放在 HttpResponseMessage 对象中?
Posted
技术标签:
【中文标题】将内容放在 HttpResponseMessage 对象中?【英文标题】:Put content in HttpResponseMessage object? 【发布时间】:2012-08-27 18:27:24 【问题描述】:几个月前,Microsoft 决定更改 HttpResponseMessage 类。以前,您可以简单地将数据类型传递给构造函数,然后返回带有该数据的消息,但现在不行了。
现在,您需要使用 Content 属性来设置消息的内容。问题是它是 HttpContent 类型的,我似乎找不到将字符串转换为 HttpContent 的方法。
有谁知道如何处理这个问题? 非常感谢。
【问题讨论】:
【参考方案1】:对于一个字符串,最快的方法是使用StringContent构造函数
response.Content = new StringContent("Your response text");
还有一些额外的HttpContent class descendants 用于其他常见场景。
【讨论】:
查看我下面的帖子,了解如何创建您自己的 StringContent 派生类型(例如 JSON、XML 等)。【参考方案2】:您应该使用Request.CreateResponse 创建响应:
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest, "Error message");
您可以将对象不仅仅是字符串传递给 CreateResponse,它会根据请求的 Accept 标头对它们进行序列化。这使您无需手动选择格式化程序。
【讨论】:
它自动与内容类型一起工作,因此您无需额外代码即可执行 xml/json 我认为如果响应是错误的,调用CreateErrorResponse()
会更正确,就像在这个答案的例子中一样。在我正在使用的 try-catch 中:this.Request.CreateErrorResponse(HttpStatusCode.InternalServerError, "message", exception);
而且,如果您完全关心尊重调用者的 Accept 标头,而没有额外的恶作剧,这是正确的答案。(并且您正在使用 WebAPI)
@FlorinDumitrescu 他的观点是,这仅适用于您继承 ApiController
的情况。如果你只是继承Controller
,那是不行的,你必须自己创建:HttpResponseMessage msg = new HttpResponseMessage(); msg.Content = new StringContent("hi"); msg.StatusCode = HttpStatusCode.OK;
【参考方案3】:
显然这里详细介绍了新的方法:
http://aspnetwebstack.codeplex.com/discussions/350492
引用亨里克的话,
HttpResponseMessage response = new HttpResponseMessage();
response.Content = new ObjectContent<T>(T, myFormatter, "application/some-format");
所以基本上,必须创建一个 ObjectContent 类型,它显然可以作为 HttpContent 对象返回。
【讨论】:
@user1760329 这将是new JsonMediaTypeFormatter();
或类似的,具体取决于您的格式
ObjectContent
未找到,使用 WCF
我不会将此定义为“新方法”-您引用的那篇文章将其列为替代方案,以防您希望“完全控制 [媒体类型]您要使用的格式化程序”
谢谢@praetor。这对我很有帮助【参考方案4】:
最简单的单行方案是使用
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" ) ;
【讨论】:
这对我不起作用,因为 IHttpActionResult 需要返回类型为 ResponseMessageResult。请参阅下面的答案以了解我的最终结果。另请注意,我确实考虑了 nashawn 的 JsonContent(派生自 StringContent 基类)。 只需包装 HttpResponseMessage 然后: return new ResponseMessageResult( return new HttpResponseMessage( HttpStatusCode.OK ) new StringContent( "Your message here" ) ); :)【参考方案5】:对于你可以做的任何 T 对象:
return Request.CreateResponse<T>(HttpStatusCode.OK, Tobject);
【讨论】:
除非Request
仅在继承ApiController
的情况下适用于CreateResponse
方法。如果使用Controller
,它将不起作用。【参考方案6】:
您可以创建自己的专业内容类型。例如,一个用于 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")
【讨论】:
非常整洁的实现。【参考方案7】:受 Simon Mattes 回答的启发,我需要满足 IHttpActionResult 所需的 ResponseMessageResult 返回类型。也使用了 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 的回答。
【讨论】:
【参考方案8】:毫无疑问,你是正确的弗洛林。我在做这个项目,发现这段代码:
product = await response.Content.ReadAsAsync<Product>();
可以替换为:
response.Content = new StringContent(string product);
【讨论】:
这个答案似乎与问题无关,也没有显示如何从对象(产品)到字符串以上是关于将内容放在 HttpResponseMessage 对象中?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 HttpResponseMessage 的 ByteArrayContent 下载为 zip
将 HttpResponseMessage.Content 数据 (ReadAsStringAsync) 限制为特定的最大大小