【问题标题】:Recommended way to handle http errors inside my asp.net mvc 5 web application在我的 asp.net mvc 5 Web 应用程序中处理 http 错误的推荐方法
【发布时间】:2015-05-30 12:24:24
【问题描述】:

我需要一种方法来全局处理我的 asp.net mvc Web 应用程序中的 http 错误。如果对操作方法的调用是 Ajax,我执行了以下操作:-

$(document).ready(function () {
    $(document).ajaxError(function (e, xhr, textStatus, errorThrown) {
        if (xhr.status == 401)
            window.location = "/Account/Login";
        else if (xhr.status == 403 || xhr.status == 404)
            alert(xhr.statusText, 'Error');

        $(".loadingimage").hide();
    });

我的操作方法如下所示:-

 [CheckUserPermissions(Action = "Edit", Model = "Skill")]
      public async Task<ActionResult> DeleteKBLink(int? skillid,int? linktokbid)
      {
          if (skillid == null || linktokbid==null)
          {
              return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
          }
      var linktokb=     await unitofwork.SkillRepository.FindLinkToKB(linktokbid.Value);
      if (linktokb == null)
              {
                  return new HttpStatusCodeResult(404, "The link has already been deleted.");
              }

但我不确定如果请求不是 ajax,我该如何处理 http 错误?目前我将被重定向到 http 未找到页面.. thnaks

【问题讨论】:

    标签: ajax asp.net-mvc asp.net-mvc-4 asp.net-mvc-5


    【解决方案1】:

    这个解决方案对我很有效...

    [1]:从 Web.config 中删除所有“customErrors”和“httpErrors”

    [2]:检查 'App_Start/FilterConfig.cs' 看起来像这样:

    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
        }
    }
    

    [3]:在'Global.asax'中添加这个方法:

    public void Application_Error(Object sender, EventArgs e)
    {
        Exception exception = Server.GetLastError();
        Server.ClearError();
    
        var routeData = new RouteData();
        routeData.Values.Add("controller", "ErrorPage");
        routeData.Values.Add("action", "Error");
        routeData.Values.Add("exception", exception);
    
        if (exception.GetType() == typeof(HttpException))
        {
            routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
        }
        else
        {
            routeData.Values.Add("statusCode", 500);
        }
    
        Response.TrySkipIisCustomErrors = true;
        IController controller = new ErrorPageController();
        controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
        Response.End();
    }
    

    [4]: 添加'Controllers/ErrorPageController.cs'

    public class ErrorPageController : Controller
    {
        public ActionResult Error(int statusCode, Exception exception)
        {
             Response.StatusCode = statusCode;
             ViewBag.StatusCode = statusCode + " Error";
             return View();
        }
    }
    

    [5]:在“视图/共享/Error.cshtml”中

    @model System.Web.Mvc.HandleErrorInfo
    @{
        ViewBag.Title = (!String.IsNullOrEmpty(ViewBag.StatusCode)) ? ViewBag.StatusCode : "500 Error";
    }
    
    <h1 class="error">@(!String.IsNullOrEmpty(ViewBag.StatusCode) ? ViewBag.StatusCode : "500 Error"):</h1>
    
    //@Model.ActionName
    //@Model.ContollerName
    //@Model.Exception.Message
    //@Model.Exception.StackTrace
    

    【讨论】:

    • 我在过去 20 小时的搜索中找到的最佳答案。
    猜你喜欢
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 1970-01-01
    • 2010-11-27
    • 2014-03-26
    • 2012-08-26
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多