2016-06-30 17 views
0

マイウェブAPIプロジェクトは現在、クライアントに配信するサーバにコンテンツを戻すには、このメソッドを使用しています。C#:既に存在するHttpResponseMessageオブジェクトに匿名型を追加する方法?

return Request.CreateResponse(HttpStatusCode.OK,someAnonymouslyTypedVariableHere); 

ASP.NETは自動的にAcceptヘッダに基づいて正しいシリアライザを選択します。

しかし、私は自分のレスポンスオブジェクトをコードの早い段階で作成し、それを必要に応じて作成したいと考えています。このように:

HttpResponseMessage m = Request.CreateResponse(); 
// a bunch of stuff happens here 
var someAnonymouslyTypedVariableHere = new { ... } 
m.Status = HttpStatusCode.OK; 
m.Content = ??? 
// potentially other code here 
return m; 

私はシリアライザを設けることなく、タイプObjectContentのオブジェクトを作成することはできませんことがわかりました。つまり、Acceptヘッダーに基づいて自動シリアライザの検出を失うことになります。

既存のHttpResponseMessageにObjectContentを割り当てる方法はありますか?ASP.NETは正しいシリアライザを選択できますか?

私がこれをやりたい理由は、コードの可読性と最適化のためです。私はHttpResponseMessageの準備ができているが、返す準備ができていない時があります。だから私が返すかもしれないすべての単一のポイントでreturn Request.CreateResponse...をやっているより、私はむしろ、コードが実行されるとHttpResponseMessageオブジェクトを生成し、それを最後に返すようにします。

確かにこのデータを変数に格納し、最後にそれを返すことができました。しかし、たとえば、あるコードフローでObjectContentではなくStringContentのコンテンツが必要であるとします。したがって、私はオブジェクトに動的にコンテンツを設定できる必要があります。

答えて

0

私が探しているように見えるこのコードスニペットがウェブ上に見つかりました。

IContentNegotiator negotiator = this.Configuration.Services.GetContentNegotiator(); 

    ContentNegotiationResult result = negotiator.Negotiate(
     typeof(myVar), this.Request, this.Configuration.Formatters); 
    if (result == null) 
    { 
     var response = new HttpResponseMessage(HttpStatusCode.NotAcceptable); 
     throw new HttpResponseException(response)); 
    } 

    return new HttpResponseMessage() 
    { 
     Content = new ObjectContent(
      myVar,    // What we are serializing 
      result.Formatter,   // The media formatter 
      result.MediaType.MediaType // The MIME type 
     ) 
    }; 
} 

ここで重要なのは、私が必要とすることができるはずのContentNegotiatorです。