2

Ajaxリクエストに使用されるカスタム承認属性があります:

public class AjaxAuthorize : AuthorizeAttribute {
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
        UrlHelper urlHelper;

        if (filterContext.HttpContext.Request.IsAjaxRequest()) {
            urlHelper = new UrlHelper(filterContext.RequestContext);

            filterContext.HttpContext.Response.StatusCode = 401;
            //Return JSON which tells the client where the login page exists if the user wants to authenticate.
            filterContext.HttpContext.Response.Write(new JavaScriptSerializer().Serialize(
                new {
                    LoginUrl = string.Format("{0}?ReturnURL={1}", FormsAuthentication.LoginUrl, urlHelper.Encode(filterContext.HttpContext.Request.Url.PathAndQuery))
                }
            ));
            filterContext.HttpContext.Response.End();
        } else {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

アプリケーションをローカルで実行すると、AjaxリクエストからJSONの結果が返されます。ただし、ベータサーバーにコードを配置すると、IIS401HTML応答が返されます。

誰かが私のコードに何か問題があり、これがローカルホストでのみ機能するようになっていますか?さらに、JSONの結果を返すためのより良いアイデアがあれば、私もそれを受け入れます。

4

1 に答える 1

4

StackOverflowには奇妙な力があり、投稿後にOPが質問を別の方法で考えるようになります。他の誰かに利益をもたらすことを期待して、ここに私の答えを残しておきます。

IIS7が邪魔をしていることに気づきました。1行のコードを追加してこれを修正しました:

filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
于 2012-08-31T16:59:07.550 に答える