JsonResult 和 ActionResult 的错误处理

拉比克斯

ASP.NET MVC 5,我想延长我的网站的一般错误处理,我有麻烦盖ActionResultJsonResult中一次。我知道这JsonResult与 不同ActionResult,但是当我返回时,ActionResult我只是给了 MVC 一个视图,对于 JsonResult,我使用 Javascript 处理结果。

因此,在 Action 的返回值是 ActionResult 并且Application_Error()返回 a 的情况下JsonResult,Json 刚刚打印在视图中。在那种情况下你该怎么办?我宁愿让它重定向到错误页面或登录屏幕。我什至不知道我是否应该制作这样的 javascript 来处理 json 的捕获以手动重定向,或者我应该使用一些“内置”MVC 机制。

在一个简化的例子中,我有两个Action's

public ActionResult ShowPackages(PackagesViewModel packagesViewModel)
{
    var model = PackageBalhelper.GetPackageViewModel(packagesViewModel);
    return View(model);
}

[HttpPost]
public JsonResult GetDatatableRows(PackagesViewModel packagesViewModel)
{
    var jsonResult = CreateJsonResult(packagesViewModel);
    return jsonResult;
}

到目前为止我所拥有的(来自MSDN

protected void Application_Error()
{
    HttpContext httpContext = HttpContext.Current;
    if (httpContext != null)
    {
        var requestContext = ((MvcHandler)httpContext.CurrentHandler).RequestContext;

        // When the request is ajax the system can automatically handle a mistake with a JSON response. Then overwrites the default response
        if (requestContext.HttpContext.Request.IsAjaxRequest())
        {
            httpContext.Response.Clear();
            string controllerName = requestContext.RouteData.GetRequiredString("controller");
            IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
            IController controller = factory.CreateController(requestContext, controllerName);
            ControllerContext controllerContext = new ControllerContext(requestContext, (ControllerBase)controller);

            var jsonResult = new JsonResult
            {
                Data = new
                {
                    success = false,
                    serverError = "500"
                },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
            jsonResult.ExecuteResult(controllerContext);
            httpContext.Response.End();
        }
        else
        {
            LogHelper.WriteMessageToLog("In 'Application_Error'. Not an ajax request'.");
            //httpContext.Response.Redirect("~/Error");
        }
    }
}

在那种情况下你该怎么办?我宁愿让它重定向到错误页面或登录屏幕。

你走在正确的轨道上。如果客户端期望来自服务器的 Json 响应,我们绝对不想返回 View (redirect to custom error page)否则,它会搞乱客户端的逻辑。

此答案可能无法直接回答您的问题。但是,如果您发现自己经常返回JsonResult,则可能需要考虑在 ASP.NET MVC 5 中使用Web API 控制器

Web API 2.1 支持GlobalExceptionHandler,您可以在其中自定义发生未处理的应用程序异常时发送的 Http 响应。

就我而言,我将Angular 与 ASP.NET MVC 和 Web API 一起使用因此,我必须为 Ajax 请求以 Json 格式返回未处理的异常。

WebApiExceptionHandler.cs

如果您的应用程序抛出自定义异常,您甚至可以在这里过滤它们,并返回适当的消息。

public class WebApiExceptionHandler : ExceptionHandler
{
    public override void Handle(ExceptionHandlerContext context)
    {
        var exception = context.Exception;
        var httpException = exception as HttpException;
        if (httpException != null)
        {
            context.Result = new WebApiErrorResult(context.Request,
                (HttpStatusCode) httpException.GetHttpCode(), httpException.Message);
            return;
        }
        /*if (exception is MyCustomException)
        {
            context.Result = new WebApiErrorResult(context.Request, 
                 HttpStatusCode.NotFound, exception.Message);
            return;
        }*/
        context.Result = new WebApiErrorResult(context.Request, 
           HttpStatusCode.InternalServerError, 
          "An error occurred while processing your request.");
    }
}

WebApiErrorResult.cs

public class WebApiErrorResult : IHttpActionResult
{
    private readonly string _errorMessage;
    private readonly HttpRequestMessage _requestMessage;
    private readonly HttpStatusCode _statusCode;

    public WebApiErrorResult(
        HttpRequestMessage requestMessage,
        HttpStatusCode statusCode,
        string errorMessage)
    {
        _requestMessage = requestMessage;
        _statusCode = statusCode;
        _errorMessage = errorMessage;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        return Task.FromResult(_requestMessage.CreateErrorResponse(_statusCode, _errorMessage));
    }
}

WebApiConfig.cs

最后,我们向框架注册我们的自定义异常处理程序。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional });

        config.Services.Replace(typeof(IExceptionHandler), new WebApiExceptionHandler());

        config.Filters.Add(new AuthorizeAttribute());
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

何时在ActionResult上使用JsonResult

来自分类Dev

错误处理和信号

来自分类Dev

无法断言在Xunit中返回jsonresult的ActionResult

来自分类Dev

将参数从jsonresult传递到actionresult

来自分类Dev

Python错误处理和连接错误

来自分类Dev

我无法在返回行中将 ActionResult 方法的结果转换为 JsonResult。我在 Visual Studio 2019 中遇到错误

来自分类Dev

Go方法链接和错误处理

来自分类Dev

Scala:错误处理和异常匹配

来自分类Dev

C检查NULL和错误处理

来自分类Dev

EJB,XA事务和错误处理

来自分类Dev

拒绝Javascript承诺和错误处理

来自分类Dev

fgets和错误处理的小麻烦

来自分类Dev

bash:错误处理和功能

来自分类Dev

jQuery延迟的错误处理和恢复

来自分类Dev

Swift 2.2错误处理和音频

来自分类Dev

python asyncio和错误处理

来自分类Dev

跨域错误处理和WCF

来自分类Dev

expressJS承诺和错误处理

来自分类Dev

Powershell 警告和错误处理

来自分类Dev

Javascript:图像错误处理和嵌套

来自分类Dev

Vba 错误处理和类 (Excel)

来自分类Dev

Swift 闭包和错误处理

来自分类Dev

Perl DBI语句处理和错误处理

来自分类Dev

评估失败Puppeteer中的错误和错误处理

来自分类Dev

ASP.Net全局错误处理和错误站点?

来自分类Dev

ClearCase [cleartool]命令错误消息和错误处理

来自分类Dev

去pq和Postgres适当的错误处理约束

来自分类Dev

new(std :: nothrow)而不是new和错误处理

来自分类Dev

使用try语句的data.table和错误处理