Domanda

Sto usando jQuery per chiamare i metodi del servizio web (* .asmx). Il servizio Web utilizza FormsAuthentication per determinare se l'utente chiamante è autenticato. Non riesco a restituire un codice di stato di reindirizzamento dal metodo Web, ad esempio

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

Il reindirizzamento non funziona, ricevo sempre 500 errori interni del server durante questa operazione. Ho provato diversi codici. Quale sarebbe il modo consigliato per andare qui? Ho bisogno di leggere le informazioni di reindirizzamento da JavaScript e caricare la nuova pagina (o forse visualizzare un controllo AJAX in modo login).

Ricevo effettivamente un oggetto JSON, che assomiglia a questo:

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

Ho provato a eseguire il debugger, ma non mostra l'inserimento di alcun metodo. Come puoi vedere, StackTrace è null ...

Quando viene invocato in Fiddler come richiesta POST standard (non XMLHttpRequest) restituisce effettivamente un'eccezione:

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)
È stato utile?

Soluzione 3

Quello che ho fatto è stato liberarmi del codice di stato e restituire semplicemente null . Un metodo restituisce un elenco vuoto se non ci sono file, con un numero totale di pagine pari a 0. Ma se l'utente non è autenticato, restituisce null , in tal caso utilizzo window.location per reindirizzare il browser alla pagina di accesso.

Altri suggerimenti

Non devi reindirizzare dal servizio Web. Dovrebbe restituire un valore per indicare se è necessario o meno reindirizzare ( Questo potrebbe essere un metodo Authenticate separato che restituisce una stringa , se è null, significa che è autenticato, in caso contrario conterrà l'URL di reindirizzamento ) Quindi in javascript, è possibile verificare il valore restituito e reindirizzare in modo appropriato impostando la proprietà window.location .

A proposito, l'accesso al servizio Web non dovrebbe richiedere l'autenticazione.

Non ho esperienza specifica con asp.net, ma in generale mi piace usare un oggetto ajaxResponse che ha proprietà come "successo", "contenuto", "errore". Una risposta di accesso richiesta in questo caso avrebbe un successo di "falso" ed errortype " login " ;, o qualunque cosa tu scelga. Il codice javascript decide quindi come gestire l'oggetto restituito in base a queste proprietà, mostrando all'utente un modulo di accesso o reindirizzando a una nuova pagina.

Genera un'eccezione nel servizio web. Cattura questo nel chiamante e reindirizza, se necessario.

In effetti, se il tuo post nei servizi web (ajax o meno) contiene un "tipo di contenuto" intestazione con valore " application / json; charset = utf-8 " ;, quindi lo stack ASMX ti restituirà una stringa formattata json con un'eccezione del supposto reindirizzamento che di solito ti aspetti includendo il codice di stato 401 (non autorizzato), ma, se non invii alcuna intestazione del tipo di contenuto , otterrai un reindirizzamento del browser alla pagina di accesso come risposta con il codice di stato OK e usando ajax, otterrai la pagina di accesso html come risposta.

Spero che questo aiuto per chiarire.

Saluti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top