Zum umleiten auf die login-Seite von einem web service in einem AJAX-call?
Bin ich mit dem jQuery-Aufruf web service (*.asmx -) Methoden. Der web-service-FormsAuthentication verwendet, um zu bestimmen, ob der aufrufende Benutzer authentifiziert ist. Ich bin nicht in der Lage, um wieder eine redirect-status code aus der web-Methode, z.B.
[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;
}
Den redirect funktioniert nicht, ich bekomme immer 500 Internal Server Error, wenn dies zu tun. Ich habe versucht, verschiedene codes. Was wäre die empfohlene Art und Weise, hier zu gehen? Ich Lesen müssen, das umleiten von Informationen aus JavaScript und laden die Seite neu (oder vielleicht die Anzeige eines login-Steuerung AJAX-Weg).
Ich tatsächlich bekommen ein JSON-Objekt zurück, das wie folgt aussieht:
{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"
}
Ich habe versucht mit dem debugger, aber es nicht zeigen, dass alle Methoden eingetragen sind. Wie Sie sehen können, der StackTrace ist null...
Wenn Sie angerufen werden, in Fiddler als standard-POST-Anforderung (nicht XMLHttpRequest) es gibt eine Ausnahme tatsächlich:
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)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie nicht umleiten von Web-service. Es sollte einen Wert zurückgeben, um anzuzeigen, ob oder nicht, sollten Sie umleiten (Dies könnte eine separate
Authenticate
Methode gibt einestring
, wenn es null ist, bedeutet es, dass es authentifiziert, wenn es nicht wahr werden, enthalten die Umleitungs-URL) Dann in javascript, könntest du den Rückgabewert überprüfen und entsprechend umleiten durch einstellen derwindow.location
Eigenschaft.Durch die Art und Weise, Zugang zu den Web-service sollte keine Authentifizierung erforderlich.
Ich habe keine Erfahrung speziell mit asp.net aber im Allgemeinen ich mag zu verwenden ein ajaxResponse-Objekt verfügt über Eigenschaften wie "Erfolg", "Inhalt", "errortype". Ein login erforderlich Antwort in diesem Fall würde ein Erfolg von "false" und errortype "login", oder was auch immer Sie wählen. Der javascript-code, der dann entscheidet, wie man mit den zurückgegebenen Objekts auf der Grundlage dieser Eigenschaften, zeigt Sie dem Benutzer ein login-Formular oder das umleiten auf eine neue Seite.
Was ich Tat, war, um loszuwerden, der status-code und nur zurück
null
. Die Methode gibt eine leere Liste zurück, wenn es keine Dateien, mit einer gesamtseitenzahl von 0. Aber wenn der Benutzer nicht authentifiziert ist, gibt esnull
in einem solchen Fall nutze ichwindow.location
Umleitung der browser auf die login-Seite.Werfen eine Ausnahme in der webservice. Fangen Sie dieses in die Anrufer und leiten als notwendig.
In der Tat, wenn Ihre post an die webservices (ajax oder nicht) enthält eine "Content-Type" - header mit dem Wert "application/json; charset=utf-8", dann die ASMX-stack senden Ihnen ein json-formatierter string mit einer Ausnahme von der soll-Umleitung, die in der Regel, die Sie erwarten, einschließlich status-code 401 (nicht autorisiert), aber, wenn Sie nicht senden Sie keine content-type-header, die Sie auch bekommen wird, eine browser-Umleitung auf die login-Seite als response mit dem Statuscode OK und mit ajax, erhalten Sie die login-Seite als html-Antwort.
Hoffe, dass diese Hilfe auf die Klärung.
Hinsichtlich