2

AJAXベースのAPIを提供するための代替方法として、MVC4プロジェクトの一部としてWebAPIを調査します。MVCコントローラーのAuthorizeAttributeを拡張して、AJAXリクエストが検出された場合に、JSON形式のエラーが返されるようにしました。WebAPIはエラーをHTMLとして返します。これが、MVCコントローラーで使用しているAuthorizeAttributeです。

public class AuthorizeAttribute: System.Web.Mvc.AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);

        filterContext.Result = new RedirectToRouteResult(
            new RouteValueDictionary 
            {
                { "area", "" },
                { "controller", "Error" },
                { "action", ( filterContext.HttpContext.Request.IsAjaxRequest() ? "JsonHttp" : "Http" ) },
                { "id", "401" },
            });
    }
}

これを再現して、Web APIと同等の機能を提供するにはどうすればよいですか?

System.Web.Mvc.AuthorizeAttributeではなくSystem.Web.Http.AuthorizeAttributeを拡張する必要があることに気付きましたが、これはAuthorizationContextではなくHttpActionContextを使用しているため、WebAPIに関する知識が限られていることと一見不完全なことに固執しています。 MSDNのドキュメント。

これが正しいアプローチであると考えるのは正しいですか?

ガイダンスをいただければ幸いです。

4

2 に答える 2

1

Web APIフィルターで同等の機能を取得するには、適切なリダイレクトステータスコードとロケーションヘッダーを持つHttpActionContext.Responseインスタンスにプロパティを設定します。HttpResponseMessage

protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) {
    var response = new HttpResponseMessage(HttpStatusCode.Redirect);
    response.Headers.Location = new Uri("my new location");
    actionContext.Response = response;
}
于 2012-04-11T19:21:30.953 に答える
0

私はMarcinの答えに非常に賛成です-一日の終わりに、彼はコードを書きました!

私が付け加えるのは、Marcinが言っているように、属性にJSONコンテンツを含む応答コード401を設定するのではなく、必要に応じてエラーを返す専用のコントローラーを用意するのが最善の策です。

主な理由は、Web APIがコンテンツネゴシエーションを実行し、それを自分で実行したい場合(JSONまたはHTMLを提供する必要があるかどうかを確認)、その機能がすべて失われることです。

于 2012-04-11T21:37:46.843 に答える