I am using jQuery to call web service (*.asmx) methods. The web service uses FormsAuthentication to determine whether the calling user is authenticated. I am unable to return a redirect status code from the web method, e.g.
[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; }
The redirect does not work, I always get 500 Internal Server Error when doing this. I tried different codes. What would be the recommended way to go here? I need to read the redirect information from JavaScript and load the new page (or maybe display a login control AJAX way).
I actually get a JSON object back, which looks like this:
{'Message':'Authentication failed.','StackTrace':null,'ExceptionType':'System.InvalidOperationException' }
I tried running the debugger, but it doesn’t show that any methods are entered. As you can see the StackTrace is null…
When invoked in Fiddler as a standard POST request (not XMLHttpRequest) it returns an exception actually:
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)
What I did was to get rid of the status code at all and just return
null. A method returns an empty list if there are no files, with a total page count of 0. But if the user is not authenticated, it returnsnull, in such case I usewindow.locationto redirect the browser to the login page.