1

IE でフレンドリー エラーをオフにしている場合はうまく機能しますが、フレンドリー エラーをオンにしている場合は表示されません。エラーページを表示するだけでMVC4が500を返す理由はわかりませんが、そうです。これが例です(SOがIP番号で反転したため、コードにする必要がありました):

http://192.52.51.45/web/Trip/Index/f32e4bc5-9e06-4bb8-8d43-d43b8c9a014c

サイトが 200 を返し、エラー ページのみを表示するには、どのような構成変更を行う必要がありますか? デフォルトの Web.config から変更したのは customErrors だけではありません。

<customErrors mode="On" />

助けてくれてありがとう。

4

1 に答える 1

4

[HandleError]グローバル属性の実装方法は次のとおりです。

public virtual void OnException(ExceptionContext filterContext)
{
    if (filterContext == null)
    {
        throw new ArgumentNullException("filterContext");
    }
    if (!filterContext.IsChildAction && (!filterContext.ExceptionHandled && filterContext.HttpContext.IsCustomErrorEnabled))
    {
        Exception innerException = filterContext.Exception;
        if ((new HttpException(null, innerException).GetHttpCode() == 500) && this.ExceptionType.IsInstanceOfType(innerException))
        {
            string controllerName = (string) filterContext.RouteData.Values["controller"];
            string actionName = (string) filterContext.RouteData.Values["action"];
            HandleErrorInfo model = new HandleErrorInfo(filterContext.Exception, controllerName, actionName);
            ViewResult result = new ViewResult {
                ViewName = this.View,
                MasterName = this.Master,
                ViewData = new ViewDataDictionary<HandleErrorInfo>(model),
                TempData = filterContext.Controller.TempData
            };
            filterContext.Result = result;
            filterContext.ExceptionHandled = true;
            filterContext.HttpContext.Response.Clear();
            filterContext.HttpContext.Response.StatusCode = 500;
            filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
        }
    }
}

ステータス コードを 500 に設定し、~/Views/Shared/Error.cshtmlビューをレンダリングする方法に注目してください。これはすべて、カスタム エラーが有効になっている場合に発生します。

ちなみに、これはこの例外的なケースで使用される意味的に正しい HTTP ステータス コードです。または、要求されたリソースが見つからない場合は 404。200 は、サーバーがユーザー要求を正常に処理した場合にのみ使用してください。

何らかの理由でこの動作が気に入らない場合は、いつでもカスタム グローバル エラー処理属性を記述して、デフォルトのもの ( ~/App_Start/FilterConfig.cs->内に登録されているfilters.Add(new HandleErrorAttribute());) を置き換えることができます。

于 2012-06-13T12:39:26.163 に答える