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 の自動シリアル化を利用できますか?
私が考えたいくつかの潜在的なアプローチは次のとおりです。
コントローラーメソッドにメインのリソースタイプを返させますが、戻り値をショートサーキットし
HttpContext.Current.Response
、何らかの方法で automagic シリアライゼーションにフックします (推奨)。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
ヘッダー ネゴシエートされた表現に設定する方法を理解する必要があります。