Frage

Ich bin mit jQuery Web-Service (* .asmx) Methoden aufrufen. Der Web-Dienst verwendet FormsAuthentication, um zu bestimmen, ob der anrufende Benutzer authentifiziert wird. Ich bin nicht in der Lage, eine Umleitung Statuscode aus der Web-Methode zurückzukehren, z.

[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;
}

Die Umleitung nicht funktioniert, habe ich immer 500 Internal Server Error, wenn dies zu tun. Ich habe versucht, verschiedene Codes. Was wäre der empfohlene Weg, hier zu gehen? Ich brauche die Umleitungsinformationen von JavaScript und laden Sie die neue Seite (oder vielleicht zeigt eine Anmeldekontrolle AJAX Art und Weise).

lesen

ich eigentlich ein JSON-Objekt zurück, das wie folgt aussieht:

{"Message":"Authentication failed.","StackTrace":null,"ExceptionType":"System.InvalidOperationException"
}

Ich habe versucht, den Debugger läuft, aber es zeigt nicht, dass alle Methoden eingegeben werden. Wie Sie die Stacktrace sehen kann, ist null ...

Wenn in Fiddler als Standard-POST-Anfrage aufgerufen (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)
War es hilfreich?

Lösung 3

Was ich tat, war zu überhaupt von dem Statuscode loszuwerden und nur null zurück. Eine Methode gibt eine leere Liste, wenn keine Dateien sind, mit einer Gesamtseitenzahl von 0. Aber wenn der Benutzer nicht authentifiziert wird, gibt sie null, in einem solchen Fall, dass ich window.location den Browser verwenden, um die Login-Seite umgeleitet werden.

Andere Tipps

Sie sollen nicht aus dem Web-Service umleiten. Es sollte einen Wert zurückgeben, um anzuzeigen, ob oder nicht, sollten Sie umleiten ( Dies könnte eine separate Authenticate Methode sein, die einen string zurückzugibt, wenn es null ist, bedeutet dies, es authentifiziert, wenn dies nicht der Fall, es wird die Umleitungs-URL enthält ) Dann in Javascript, können Sie den Rückgabewert überprüfen und leiten Sie in geeigneter Weise durch die window.location Eigenschaft festlegen.

Durch die Art und Weise der Zugriff auf die Web-Service sollte nicht eine Authentifizierung erfordern.

ich Erfahrung nicht speziell mit asp.net habe aber im Allgemeinen Ich mag ein ajaxResponse Objekt verwenden, die Eigenschaften wie „Erfolg“, „Inhalt“, „errortype“ hat. Eine Anmeldung erforderlich Antwort in diesem Fall hätte einen Erfolg von „false“ und errortype „login“, oder was auch immer Sie sich entscheiden. Der Javascript-Code entscheidet dann, wie das zurückgegebene Objekt zu handhaben auf der Grundlage dieser Eigenschaften, um den Benutzer ein Anmeldeformular zeigt oder auf eine neue Seite umgeleitet wird.

eine Ausnahme in der webservice werfen. Fangen Sie diese in den Anrufer und leitet bei Bedarf.

In der Tat, wenn Ihr Beitrag zu dem Web Service (Ajax oder nicht) enthält einen "Content-Type" Header mit dem Wert "application / json; charset = utf-8", dann wird der ASMX Stapel Sie eine json zurückschicken formatiertem String mit Ausnahme der vermeintlichen Umleitung, die in der Regel Sie Statuscode 401 (nicht autorisierte) erwarten, einschließlich, aber, wenn Sie keine Inhaltstyp-Header senden, erhalten Sie auch eine Browser-Umleitung auf die Login-Seite als Antwort mit dem Statuscode OK und mit ajax, erhalten Sie den Login-Seite hTML-Code als Antwort erhalten.

Ich hoffe, dass diese Hilfe zu klären.

Viele Grüße

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top