2010-07-21 7 views
15

Je dispose d'un service Web ASMX hébergé à côté de mon application Web ASP.NET. Maintenant, j'ai besoin d'obtenir la session des utilisateurs dans le Webservice. Pour tester cela, je fait cette méthode simple:Obtenir une session dans le service Web .NET ASMX

[WebMethod(EnableSession = true)] 
    public string checkSession() 
    { 
     return HttpContext.Current.Session["userid"].ToString(); 
    } 

Alors, d'abord je me connecte à mon application Web, puis dans le navigateur goto mon webservice et cliquez sur « checkSession » sur cette auto générée page de test. J'ai testé cela sur 3 ordinateurs. Tous les 3 fonctionnent correctement avec la webapp (donc les sessions sont créées, etc), et 2 d'entre elles retournent la valeur de Session ["userid"] en invoquant la méthode web, cependant le dernier ordinateur retourne "Object reference not set to instance d'un objet "car Session est nulle.

Alors, quelle est la différence entre ces ordinateurs et pourquoi mon application ASP.NET peut-elle obtenir les sessions sur tous les ordinateurs mais le service web ne peut pas?

+3

Comment stockez-vous votre session? Si in-proc vous avez besoin du service web asmx pour fonctionner sur le même appPool que la webapp. Et obtenez-vous l'erreur de session pour cette machine tout le temps? –

+0

Je ne sais pas vraiment. Tout ce que je fais est que quand ils se connectent initialement sur le côté ASP.NET, je définis: Session ["userid"] = theiridfromdb; Tout d'abord, comment puis-je vérifier si elle est in-proc, et comment puis-je exécuter le webservice dans le même appPool? Oui, cet ordinateur donne toujours l'erreur. – Matt

+0

Il semble que inproc est la valeur par défaut, donc oui, je l'utilise. Je l'exécute sur un serveur dédié exécutant IIS6, et le site ASP.NET et le service web sont une application. Comme dans, ils sont la même application dans IIS et Visual Studio compile leurs deux backend à la même DLL. – Matt

Répondre

3

Les ID de session sont stockés en tant que cookies sur le navigateur du client par défaut (Session State Overview). Vérifiez donc si ce cookie est créé correctement sur cet ordinateur à problème. Peut-être que les cookies sont désactivés pour une raison quelconque? Dans ce cas, il ne serait pas envoyer le SessionID au serveur lorsque vous frappez ce service Web.

0

par les services Web par défaut sont et devraient être sans état. Toutefois, si vous devez utiliser des informations de session, veillez à utiliser les interfaces de marqueur IReadOnlySessionState et IRequiresSessionState pour accéder, utiliser ou modifier les informations d'état de session dans le service Web.

0

meilleure façon de faire cette approche vérifier avant que votre session n'est pas nulle et dans l'autre côté vous initialiser la session sélectionnée avec votre valeur, puis quand et où le service Web travaillant avec httpcontext.current.session ont une valeur!

services Web sont sans état et le meilleur moyen est d'obtenir la valeur en service Web au lieu de jeu ou initialize valeur de session

2

Pouvez-vous vérifier combien de processus de travail est votre application à l'aide? Vous pouvez le vérifier dans les paramètres de votre pool d'applications dans IIS.

Si plus d'un processus de travail est utilisé, il est appelé à faire fonctionner un Web Garden. Si tel est le cas alors dans la session proc ne sera pas utile car cette session n'est pas partagée parmi les processus de travail. Jetez un oeil à http://www.west-wind.com/weblog/posts/2005/Apr/20/Why-you-shouldnt-use-InProc-Session-State-in-ASPNET

0

Le service Web par défaut ne prend pas en charge Session.Vous devez spécifier explicitement le paramètre dans la méthode web attribut

Ces deux choses travaillent pour moi

  1. <add name="Session" type="System.Web.SessionState.SessionStateModule"/> sous <httpModules>

  2. enableSessionState="true" dans <page> tag

+0

Est-ce 1 ET 2, ou 1 OU 2? –

+0

1 et 2; Faites la 1ère étape, puis activez sessionState dans la page (step2) –

4

mai il est trop tard, mais avez-vous essayé ceci:

[WebMethod(EnableSession = true)] 
public string checkSession() 
{ 
    return HttpContext.Current.Session.SessionID 
} 
+1

C'est exactement ce que j'avais besoin de savoir et cela a corrigé mon problème de session null. Je viens de mettre [WebMethod (EnableSession = true)] sur ma méthode, qui retourne d'autres données. Je vous remercie! –