首页 > 解决方案 > 我需要从 C# 函数属性返回 Ajax 错误响应

问题描述

我有一个 ASP.NET MVC 网站,其中包含对不同服务器端功能的大量 Ajax 调用。此站点需要登录,因此如果用户未登录,它不应该返回任何 JSON 数据。我已经设置了站点,以便如果用户尝试转到登录以外的任何页面或文件页面,它将它们返回到登录页面。问题是它也使用 JsonResponse 函数执行此操作,当需要 Json 对象时返回登录页面的代码。我需要 Ajax 函数来识别“未登录”错误,以便它可以启动将用户发送回登录页面。

一点背景知识,该站点通过 WCF Web 服务进行所有数据库检索。每当用户与数据库进行交互时,都会更新用户表中的 last_access DateTime 字段。如果用户尝试访问某些内容并且 last_access 字段在 X 分钟前显示,则 Web 服务会在 Web 服务器上返回“未登录”错误。当发生这种情况时,我有 Application_Error 将它们发送回登录页面并发出通知。

我需要一种方法来区分需要返回登录页面的函数和需要返回实际错误的函数,函数属性似乎是最简单的方法。

这是 JsonResult 函数之一的示例

[HttpPost]
[AjaxTimeoutErrorCheck]
public JsonResult GetRecords() {
    ExpDataClient client = new ExpDataClient();

    string groups = string.Join(",", SearchSettings.GetGroups().Select(g => g.employerId).ToList());

    List<ExpDataService.GetEligibilityResult> items = client.GetEligibility(groups);

    JsonResult json = Json(items, JsonRequestBehavior.AllowGet);
    json.MaxJsonLength = int.MaxValue;
    return json;
}

我设置了一个属性对象来处理相关函数中的异常。如果我执行以下操作

filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
filterContext.RequestContext.HttpContext.Response.StatusDescription = "No user logged in";

在不设置 filterContext.Result 的情况下,我可以让 Ajax 函数将其识别为错误,但返回对象中没有任何内容表明这是错误。我怀疑我只是在混淆响应。

我试过使用这个https://stackoverflow.com/a/43069917/487909来创建一个对象来分配给filterContext.Result,但似乎将filterContext.Result设置为任何东西(至少除了null)会导致将返回的对象识别为有效的 Ajax 函数。

这是我目前拥有的属性对象

public class AjaxTimeoutErrorCheck : FilterAttribute, IExceptionFilter {
    void IExceptionFilter.OnException(ExceptionContext filterContext) {
        if (filterContext.Exception.Message == "At least one security token in the message could not be validated.") {

            filterContext.ExceptionHandled = true;

            var response = new { statusText = "No user logged in" };

            filterContext.RequestContext.HttpContext.Response.Status = "401 Unauthorized";
            filterContext.RequestContext.HttpContext.Response.StatusCode = 401;
            filterContext.RequestContext.HttpContext.Response.StatusDescription = "No user logged in";
            filterContext.Result = new Models.JsonHttpStatusResult(response, System.Net.HttpStatusCode.Unauthorized);
        };
    }
}

标签: c#jsonajaxasp.net-mvcattributes

解决方案


推荐阅读