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


180

数か月前、マイクロソフトはHttpResponseMessageクラスを変更することを決定しました。以前は、単純にデータ型をコンストラクターに渡して、そのデータを含むメッセージを返すことができましたが、それ以上はできなくなりました。

次に、Contentプロパティを使用してメッセージのコンテンツを設定する必要があります。問題は、タイプがHttpContentであり、文字列をHttpContentなどに変換する方法が見つからないようです。

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

回答:


216

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

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

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


StringContentの独自の派生型(JSON、XMLなど)の作成については、以下の私の投稿を参照してください。
bytedev

135

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オブジェクトとして返すことができます。


31
myFormatterとは
グレッグZ.

1
@ user1760329それは次のようになりますnew JsonMediaTypeFormatter();か、あなたのフォーマットに応じて、類似した
ジョン

1
ObjectContentが見つかりません、WCFを使用して
Medet Tleukabiluly 2014年

2
私はこれを「新しい方法」とは見なしません-あなたが参照する記事は、「使用したい[メディアタイプ]フォーマッタの完全な制御」をしたい場合の代替としてリストしています
ベルン

@praetorに感謝します。これは私にとって本当に役に立ちました
SO User

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( "Your message here")}); :)
Simon Mattes 2017

41

Tオブジェクトの場合、次のことができます。

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

5
Except Requestは、CreateResponseメソッドを継承してApiControllerいる場合にのみ使用できます。を使用している場合は機能しませんController
vapcguy

15

独自の特殊なコンテンツタイプを作成できます。たとえば、1つはJsonコンテンツ用で、もう1つは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")
    {
    }
}

非常にきちんとしたクリーンな実装。
2016年

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

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


文字列補間は不要のようです
Igor Pashchuk

0

あなたが正しいフロリンであることは間違いありません。私はこのプロジェクトに取り組んでいて、このコードの一部が次のとおりであることを発見しました:

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

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

response.Content = new StringContent(string product);

1
この回答は質問には関係がないようで、オブジェクト(製品)から文字列に移動する方法を示していません
mageos
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.