2008-12-15 4 views
2

Nous appelons le service Web Ajax Asp.Net du côté client. Ainsi, les fonctions JavaScript ont des appels comme:Comment réparer: InvalidOperationException lors de l'expiration de la session dans l'appel Ajax WebService

// La fonction pour modifier l'objet d'état côté serveur et définir le nœud sélectionné pour l'arbre de cas.

function JSMethod(caseId, url) 
{ 
    Sample.XYZ.Method(param1, param2, OnMethodReturn); 
} 

function OnMethodReturn(result) 
{ 
    var sessionExpiry = CheckForSessionExpiry(result); 
    var error = CheckForErrors(result); 

    ... process result 
} 

Et du côté du serveur dans le fichier « .asmx.cs »: espace de noms Exemple

[ScriptService] 
class XYZ : WebService 
{ 
     [WebMethod(EnableSession = true)] 
     public string Method(string param1, string param2) 
     { 
      if (SessionExpired()) 
      { 
       return sessionExpiredMessage; 
      } 
      . 
      . 
      . 
     } 
} 

Le site est configuré pour utiliser l'authentification par formulaire. Maintenant si la session a expiré et que la fonction JavaScript "JSMethod" est invoquée, alors l'erreur suivante est obtenue: Erreur d'exécution Microsoft JScript: Sys.Net.WebServiceFailedException: La méthode du serveur 'Méthode' a échoué avec l'erreur suivante: Système .InvalidOperationException: l'authentification a échoué.

Cette exception est soulevée par la méthode "fonction $ Bénéfice net $ Sys WebServiceProxy $ Invoke" dans le fichier "ScriptResource.axd":

function Sys$Net$WebServiceProxy$invoke 
{ 

      . 
      . 
      . 
       { 
        // In debug mode, if no error was registered, display some trace information 
        var error; 
        if (result && errorObj) { 
         // If we got a result, we're likely dealing with an error in the method itself 
         error = result.get_exceptionType() + "-- " + result.get_message(); 
        } 
        else { 
         // Otherwise, it's probably a 'top-level' error, in which case we dump the 
         // whole response in the trace 
         error = response.get_responseData(); 
        } 
        // DevDiv 89485: throw, not alert() 
        throw Sys.Net.WebServiceProxy._createFailedError(methodName, String.format(Sys.Res.webServiceFailed, methodName, error)); 
} 

Le problème est que l'exception est soulevée avant même "Méthode" est invoqué, l'exception se produit lors de la création du proxy Web. Toute idée sur la façon de résoudre ce problème

Répondre

0

Vous avez une méthode de rappel (OnMethodReturn) spécifiée dans l'appel WebMethod, mais pas une méthode de gestionnaire d'erreur. Vous devez en créer un et le transmettre comme vous le faites la méthode de rappel. Ensuite, vous pouvez gérer vos appels WebMethod échoué là-dedans.

0

Ce problème se produit même avant que le framework Ajax puisse appeler la méthode cible, il échoue lors de la création du proxy Web. Quoi qu'il en soit, j'ai résolu le problème en activant l'accès anonyme au dossier Service Web et en vérifiant explicitement Session dans les méthodes du service Web

0

Pourquoi ne pas utiliser, try { } catch { } autour de votre appel de méthode JS?

-1

essayez celui-ci ... utiliser "statique"

[WebMethod(EnableSession = true)] 
public static string Method(string param1, string param2) 
+0

-1: statique est seulement pour PageMethods –

Questions connexes