将内容放在HttpResponseMessage对象中?


180

几个月前,Microsoft决定更改HttpResponseMessage类。以前,您可以简单地将数据类型传递到构造函数中,然后返回带有该数据的消息,但不再返回。

现在,您需要使用Content属性来设置消息的内容。问题是它的类型为HttpContent,而且我似乎找不到找到将字符串转换为HttpContent的方法。

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

Answers:


216

特别是对于字符串,最快的方法是使用StringContent构造函数

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

对于其他常见方案,还有许多其他的HttpContent类后代


请参阅下面的我的文章,以创建您自己的StringContent派生类型(例如JSON,XML等)。
bytedev

134

您应该使用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)
JMD

2
@FlorinDumitrescu他的观点是,这仅适用于您继承时ApiController。如果您只是继承而已Controller,那么它就行不通了,您必须自己创建它: HttpResponseMessage msg = new HttpResponseMessage(); msg.Content = new StringContent("hi"); msg.StatusCode = HttpStatusCode.OK;
vapcguy

64

显然,这里有详细的新方法:

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

引用亨里克的话,

HttpResponseMessage response = new HttpResponseMessage();

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

因此,基本上,必须创建一个ObjectContent类型,显然可以将其作为HttpContent对象返回。


30
什么是myFormatter
Greg Z.

1
@ user1760329,new JsonMediaTypeFormatter();取决于您的格式,它可能是a 或类似值
约翰·

1
ObjectContent找不到,使用WCF
Medet Tleukabiluly 2014/11/25

2
我没有资格这个“新的方式来做到这一点” -你引用其列为在事件中,你想拥有的“[媒体类型]的完全控制格式化您要使用”替代那篇文章
伯尔尼

谢谢@praetor。这一直是真的对我很有帮助
SO用户

53

最简单的单线解决方案是使用

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基类派生)。
亚当·考克斯

1
只需包装HttpResponseMessage然后:return new ResponseMessageResult(return new HttpResponseMessage(HttpStatusCode.OK){new StringContent(“此处为您的消息”)}); :)
Simon Mattes

41

对于任何T对象,您都可以执行以下操作:

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

5
RequestCreateResponse当您继承时,except 才可用于某个方法ApiController。如果使用,它将不起作用Controller
vapcguy

15

您可以创建自己的专用内容类型。例如,一个用于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")
    {
    }
}

非常整洁干净的实施。
山姆

3

受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的回答。


字符串插值似乎没有必要
Igor Pashchuk '19

0

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

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

可以替换为:

response.Content = new StringContent(string product);

1
这个答案似乎与问题无关,并且没有显示如何从对象(产品)变成字符串
mageos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.