将内容放在 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) 限制为特定的最大大小

从 HttpResponseMessage 获取内容/消息

从 HttpResponseMessage 获取内容/消息

HttpResponseMessage 内容不会显示 PDF

我如何将web api中的标题内容返回给AngularJS $ http服务