Мне нужно вернуть ответ об ошибке Ajax из атрибута функции C # - PullRequest
0 голосов
/ 07 мая 2019

У меня есть веб-сайт ASP.NET MVC с большим количеством вызовов Ajax для различных функций на стороне сервера.Этот сайт требует входа в систему, поэтому он не должен возвращать какие-либо данные JSON, если пользователь не вошел в систему. Я уже настроил сайт так, чтобы, если пользователь пытается перейти на любую страницу или файл, кроме входа в системустраница, он возвращает их на страницу входа.Проблема в том, что он делает это и с функциями JsonResponse, возвращая код страницы входа в систему, когда ожидается объект Json.Мне нужна функция Ajax для распознавания ошибки «Not Logged In», чтобы она могла инициировать отправку пользователя обратно на страницу входа.

Немного предыстории, сайт выполняет поиск всей своей базы данных через веб-сервис WCF.,Когда пользователь вообще взаимодействует с базой данных, поле DateTime last_access в таблице пользователей обновляется.Если пользователь пытался получить доступ к чему-либо, а поле last_access показывает более X минут назад, веб-служба выдает ошибку «Not Logged In» обратно на веб-сервер.У меня 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 на что-нибудь (отличное от нуля, по крайней мере) заставляет функцию 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);
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...