web-dev-qa-db-ja.com

HttpResponseMessageオブジェクトにコンテンツを入れますか?

数ヶ月前、MicrosoftはHttpResponseMessageクラスを変更することを決めました。以前は、単純にデータ型をコンストラクタに渡してから、そのデータとともにメッセージを返すことができましたが、それはできなくなりました。

これで、Contentプロパティを使ってメッセージの内容を設定する必要があります。問題はそれがHttpContent型であるということです、そして、私は例えばHttpContentに文字列を変換する方法を見つけることができないようです。

誰もがこの問題に対処する方法を知っていますか?どうもありがとう。

154
praetor

どうやらそれを行うための新しい方法はここに詳述されています:

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

ヘンリックを引用すると、

HttpResponseMessage response = new HttpResponseMessage();

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

そのため、基本的にはObjectContent型を作成する必要があります。これは明らかにHttpContentオブジェクトとして返すことができます。

53
praetor

特に文字列の場合、最も簡単な方法は StringContent コンストラクタを使用することです。

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

その他の一般的なシナリオには、追加の HttpContentクラスの子孫 があります。

181
Jim O'Neil

あなたは Request.CreateResponse を使ってレスポンスを作成するべきです:

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

文字列だけではなくオブジェクトをCreateResponseに渡すこともでき、リクエストのAcceptヘッダーに基づいてオブジェクトをシリアル化します。これにより、手動でフォーマッタを選択する手間が省けます。

114

どのTオブジェクトに対しても、次のことができます。

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

最も簡単な単一行の解決策は

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" ) };
37
Simon Mattes

あなたはあなた自身の特別なコンテンツタイプを作成することができます。たとえば、Jsonコンテンツ用とXmlコンテンツ用の1つです(その後、それらを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")
    {
    }
}
15
bytedev

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)}")
            });

JsonContentに対するnashawnの回答を参照してください。

4
Adam Cox

あなたが正しいフロリンであることは間違いありません。私はこのプロジェクトに取り組んでいました、そして、このコードの断片がそれを見つけました:

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

に置き換えることができます:

response.Content = new StringContent(string product);
0
Steven W. H.