Как перенаправить на страницу входа в систему из веб-службы в вызове AJAX?
-
03-07-2019 - |
Вопрос
Я использую jQuery для вызова методов веб-сервиса (* .asmx).Веб-служба использует FormsAuthentication, чтобы определить, аутентифицирован ли вызывающий пользователь.Я не могу вернуть код состояния перенаправления из веб-метода, например
[WebMethod(EnableSession=true)]
public Dictionary<string, object> GetArchivedFiles(int pageSize, int page)
{
if(HttpContext.Current.User.Identity.IsAuthenticated && Session["UserId"] != null)
// Do some computing and return a Dictionary.
// Method will fall through here if the user is not authenticated.
HttpContext.Current.Response.StatusCode = (int) HttpStatusCode.Unauthorized;
return null;
}
Перенаправление не работает, я всегда получаю внутреннюю ошибку сервера 500 при выполнении этого.Я пробовал разные коды.Как бы вы порекомендовали поступить здесь?Мне нужно прочитать информацию о перенаправлении из JavaScript и загрузить новую страницу (или, возможно, отобразить AJAX-способ управления входом).
На самом деле я получаю обратно объект JSON, который выглядит примерно так:
{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"
}
Я попытался запустить отладчик, но он не показывает, что какие-либо методы введены.Как вы можете видеть, трассировка стека равна нулю...
При вызове в Fiddler в качестве стандартного POST-запроса (не XMLHttpRequest) он фактически возвращает исключение:
HTTP/1.1 500 Internal Server Error
Server: ASP.NET Development Server/9.0.0.0
Date: Wed, 04 Mar 2009 14:46:02 GMT
X-AspNet-Version: 2.0.50727
Cache-Control: private
Content-Type: text/plain; charset=utf-8
Content-Length: 1739
Connection: Close
System.NotSupportedException: The type System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Object, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] is not supported because it implements IDictionary.
at System.Xml.Serialization.TypeScope.GetDefaultIndexer(Type type, String memberInfo)
at System.Xml.Serialization.TypeScope.ImportTypeDesc(Type type, MemberInfo memberInfo, Boolean directReference)
at System.Xml.Serialization.TypeScope.GetTypeDesc(Type type, MemberInfo source, Boolean directReference, Boolean throwOnError)
at System.Xml.Serialization.ModelScope.GetTypeModel(Type type, Boolean directReference)
at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root, String defaultNamespace)
at System.Xml.Serialization.XmlReflectionImporter.ImportTypeMapping(Type type, XmlRootAttribute root)
at System.Web.Services.Protocols.XmlReturn.GetInitializers(LogicalMethodInfo[] methodInfos)
at System.Web.Services.Protocols.XmlReturnWriter.GetInitializers(LogicalMethodInfo[] methodInfos)
at System.Web.Services.Protocols.MimeFormatter.GetInitializers(Type type, LogicalMethodInfo[] methodInfos)
at System.Web.Services.Protocols.HttpServerType..ctor(Type type)
at System.Web.Services.Protocols.HttpServerProtocol.Initialize()
at System.Web.Services.Protocols.ServerProtocol.SetContext(Type type, HttpContext context, HttpRequest request, HttpResponse response)
at System.Web.Services.Protocols.ServerProtocolFactory.Create(Type type, HttpContext context, HttpRequest request, HttpResponse response, Boolean& abortProcessing)
Решение 3
Я вообще избавился от кода статуса и просто возвратил null
. Метод возвращает пустой список, если файлов нет, общее количество страниц равно 0. Но если пользователь не прошел проверку подлинности, он возвращает null
, в этом случае я использую window.location
, чтобы перенаправить браузер на страницу входа.
Другие советы
Не следует перенаправлять из веб-службы. Он должен возвращать значение, чтобы указать, следует ли вам перенаправить или нет ( Это может быть отдельный метод Authenticate
, который возвращает string
, если он нулевой, это означает, что аутентифицируется, если это не так, он будет содержать URL-адрес перенаправления . Затем в javascript вы можете проверить возвращаемое значение и соответствующим образом перенаправить, установив свойство window.location
.
Кстати, доступ к веб-сервису не должен требовать аутентификации.
У меня нет конкретного опыта работы с asp.net, но в целом мне нравится использовать объект ajaxResponse, который имеет такие свойства, как «success», «content» и «errortype». Ответ, требующий входа в систему, в этом случае будет иметь успех " ложь " и errortype " login " или что вы выберете. Затем код javascript решает, как обрабатывать возвращаемый объект, основываясь на этих свойствах, показывая пользователю форму входа или перенаправляя на новую страницу.
Создайте исключение в веб-сервисе. Поймайте это в вызывающем и перенаправьте при необходимости.
Фактически, если ваше сообщение на веб-сервисах (ajax или нет) содержит заголовок "Content-Type" со значением "application / json;charset=utf-8", тогда стек ASMX отправит вам обратно строку в формате json, за исключением предполагаемого перенаправления, которое обычно вы ожидаете, включая код статуса 401 (неавторизованный), но, если вы не отправите заголовок типа контента, вы получите перенаправление браузера на страницу входа в систему в качестве ответа с кодом статуса OK и, используя ajax, вы получите html страницы входа в систему в качестве ответа.
Надеюсь, что это поможет в разъяснении.
С уважением