Я использую 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 Internal Server Error при этом. Я пробовал разные коды. Каков будет рекомендуемый путь сюда? Мне нужно прочитать информацию о перенаправлении из JavaScript и загрузить новую страницу (или, возможно, отобразить AJAX-способ управления входом в систему).
На самом деле я возвращаю объект JSON, который выглядит так:
{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"
}
Я попытался запустить отладчик, но он не показывает, что введены какие-либо методы. Как вы видите, StackTrace имеет значение null ...
При вызове в 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)