10

ASP.NET MVC 4 Web API を使用して、HTTP 経由で真の RESTful Web サービスを作成しようとしています。

現在の課題は、ステータス コードに基づいてさまざまな戻り値の型 (エンティティ ボディ) を返すことです。

たとえば、リソース Hammer の場合、.NET モデル クラス "Hammer" と HammerController があります。

namespace Awesomeness
{
    public class HammerController : ApiController
    {
        public Hammer Get(int id)
        {
        }
...

ID が存在しない場合 (404)、または別の承認が必要な場合 (401) は、リターンを簡単にショートカットして、ステータス コードやその他のコンテンツを手動で設定できます。これはすばらしいことです。ただし、2xx 以外の多くのステータスでは、ハンマー リソース表現とは異なるエンティティ ボディを返したいと考えています。これは手動で簡単に行うことができますが、要求ヘッダーに応じて XML または JSON との間で ASP.NET MVC 4 Web API の自動シリアル化および逆シリアル化を利用したいと考えています。

私の中心的な質問は、さまざまな戻り値の型を返すときに、ASP.NET MVC 4 Web API の自動シリアル化を利用できますか?

私が考えたいくつかの潜在的なアプローチは次のとおりです。

  1. コントローラーメソッドにメインのリソースタイプを返させますが、戻り値をショートサーキットしHttpContext.Current.Response、何らかの方法で automagic シリアライゼーションにフックします (推奨)。

  2. Model クラスを、この型またはその型を表す C ユニオンのようにし、通常のリターン プロセスの一部としてシリアル化できるようにします (ステータス コードと必要な応答ヘッダーをオーバーライドするだけです)。これをどうやってやるのか考えても、やっぱりハッキーになりそうな予感がします。

2012 年 4 月 27 日編集: 次のように HttpResponseException をスローできます。

HttpResponseMessage response = new HttpResponseMessage(statusCode);
if (!string.IsNullOrWhiteSpace(text))
{
    response.Content = new StringContent(text);
}
throw new HttpResponseException(response);

response.Content...しかし、自動マジック シリアライゼーションにフックして、Acceptヘッダー ネゴシエートされた表現に設定する方法を理解する必要があります。

4

1 に答える 1

16

私は、この他の質問で受け取った回答から、この質問に対する明確な回答を導き出しました。

戻り値を作成すると、 。を返すことHttpResponseMessageで、必要なステータスやコンテンツを返すことができますnew HttpResponseMessage()

2012年5月10日編集:@DarrelMillerからの入力のおかげで、廃止されたものが削除され、 extensionメソッドHttpResponseMessage<T>の呼び出しに置き換えられました。HttpRequestMessage.CreateResponse<T>()注:この拡張メソッドは、MVC4/WebAPIベータ版では使用できません。ソースからビルドするか、ナイトリービルドを取得する必要があります。

過度に単純化された例:

public HttpResponseMessage Post(MyResource myResource)
{
    ...
    if (goodStuff)
    {
        return ControllerContext.Request.CreateResponse(HttpStatusCode.Created, myNewResource);
    }
    else if (badStuff)
    {
        return ControllerContext.Request.CreateResponse(HttpStatusCode.BadRequest, badRequest);
    }
    else
    {
        return new HttpResponseMessage(HttpStatusCode.InternalServerError);
    }
}
于 2012-04-28T04:24:24.127 に答える