c# - 我需要从 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);
};
}
}
解决方案
推荐阅读
- javascript - autoComplete.js 未捕获(承诺中)未定义,无法在 IE 11 上选择自动完成结果
- ios - 实例化一个结构体,它是 iOS 框架的一部分并具有内部访问控制
- c++ - 访问模型变量
- jenkins - Jenkins httprequest 多部分表单 POST
- sapui5 - “导航”是字符串类型,预期元素的属性“布局”的 sap.f.LayoutType
- node.js - Can't remove exif data with Node: 查看以两种不同格式写入缓冲区的 exif 数据
- docker - 我怎么知道我应该在 k8s pod 中提供多少内存?
- google-cloud-platform - Google BigQuery 无法读取某些 ORC 数据
- windows - 如何在windows上使用flutter的eventchannel for desktop?
- c# - 根据深度图切割远处的物体