我需要从C#函数属性返回一个Ajax错误响应

时间:2019-05-07 14:21:02

标签: c# json ajax asp.net-mvc attributes

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

有点背景,该站点通过WCF Web服务进行所有数据库检索。每当用户与数据库进行交互时,users表中的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设置为 anything (至少不为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);
        };
    }
}

0 个答案:

没有答案