5

ASP.NET MVC 3 プラットフォームを使用していくつかの REST リソースを開発しています。これまでのところ、MVC 3 の柔軟性が気に入っています。MVC 3 を使用して REST サービスを簡単に構築できます。私が苦労してきた領域の 1 つは、Global.asax のルート制約です。1つは、それらが適切に機能していないように見えることです(入力が制約の要件を最も確実に満たしている場合でも、常に404を返すものを含む...しかし、それは別の質問です)。

次に、さらに重要なこととして、制約が失敗したときに返される結果は常に HTML ページです。制約が機能すると仮定すると、これらの REST サービスのすべてのコンシューマーが application/json、text/xml、場合によっては bson などのデータ型を受け入れる場合、結果が HTML になると、実際には混乱が生じます。側波帯の解決のために単純に html を爆破してログに記録するのではなく、クライアントのエラーに直接対処できるようにするためです。

ルート制約に応答して返されるものを変更することは可能ですか? リクエストを発行するクライアントが application/bson のみを受け入れる場合、単純に単一の MIME タイプの定型応答を生成するのではなく、許容可能な応答を生成できるように、返されたものを動的にすることは可能ですか?

4

2 に答える 2

3

コントローラに移動する代わりにコードエラーを返すことについては、カスタムRouteHandlerを実装する必要があります。このリンクは、指を置くことができるすべてのものを再開します...そして、この方法で変更することができます。リターンタイプの「適応」について...これはコントローラーで行うことができます。Json(...)を返す場合と、ViewまたはPartialViewを返す場合は、somを入れるだけで十分です。

ただし、コントローラーフィルターでこれを行うのは良いことです...!

コントローラーがクライアントとリターンタイプをネゴシエートできるようにするコントロールフィルターを実装しました。私は非常に単純です...クライアントは、ルートパラメータ(URLの一部またはクエリ文字列)で、またはこの情報を含むフィールドを投稿することによって、受信したいタイプを宣言するだけです。使用法は非常に簡単です...クライアントから情報がない場合、rcontrollerは「デフォルト」の戻りタイプでビューを返すことができます。次に、フィルターは、ビューが呼び出される前に結果タイプを自動的に「変更」し、クライアントが必要とするものに変換します。フィルタによって処理される可能性は、クライアントまたはJsonによって名前が選択されたビューです。

コードはここにあります(悪意のあるユーザーによる攻撃を防ぐためにクライアントによって提供される「ヒント」に対するいくつかのコントロールが含まれています):

public class AcceptViewHintAttribute : ActionFilterAttribute
{
    private JsonRequestBehavior jsBehavior;
    public AcceptViewHintAttribute(JsonRequestBehavior jsBehavior = JsonRequestBehavior.DenyGet)
    {
        this.jsBehavior = jsBehavior;
    }
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        string hint = filterContext.RequestContext.HttpContext.Request.Params["ViewHint"];
        if (hint == null) hint = filterContext.RequestContext.RouteData.Values["ViewHint"] as string;
        if (!string.IsNullOrWhiteSpace(hint) && hint.Length<=100 && new Regex(@"^\w+$").IsMatch(hint) )
        {


                ViewResultBase res = filterContext.Result as ViewResultBase;
                if (res != null)
                {
                    if (hint == "json")
                    {
                        JsonResult jr = new JsonResult();
                        jr.Data = res.ViewData.Model;
                        jr.JsonRequestBehavior = jsBehavior;
                        filterContext.Result = jr;
                    }
                    else
                    {
                        res.ViewName = hint;
                    }
                }

        }
        base.OnActionExecuted(filterContext);
    }
}
于 2012-03-07T21:08:16.737 に答える
3

エラーリューションは、ここで役立つかもしれません。

カスタム ロジックを記述して、HTTPAcceptヘッダーをチェックしたり[SomeContext].Request.IsAjaxRequest()、JSON または BSON を返すのが適切かどうかを確認したり、必要に応じてすべてのタイプの要求に対して JSON または BSON を返すことができる場合があります。

于 2012-03-05T23:38:07.520 に答える