在.NET ASMX Web服务中获取会话

我的ASP.NET Web应用程序旁边有一个ASMX Web服务。 现在,我需要将用户会话引入Webservice。 为了测试这个我做了这个简单的方法:

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

所以,首先我登录我的网络应用程序,然后在浏览器中转到我的webservice并在该自动生成的测试页面上单击“checkSession”。 我在3台电脑上测试了这个。 所有这3个都可以正常使用webapp(因此正在创建会话等),其中2个在调用webmethod时返回Session [“userid”]的值,但最后一台计算机返回“对象引用未设置为对象的实例“因为Session是null。

那么,这些计算机之间的区别是什么?为什么我的ASP.NET应用程序可以在所有计算机上获得会话但是webservice不能?

也许已经太晚了,但你试过这个:

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

默认情况下, 会话 ID在客户端的浏览器中存储为cookie( 会话状态概述 )。 因此,请检查该问题计算机上是否正确创建了该cookie。 可能由于某种原因禁用cookie? 在这种情况下,当您访问该Web服务时,它不会将SessionID发送到服务器。

您可以查看您的应用程序使用了多少个工作进程? 您可以在IIS中的应用程序池设置中进行检查。

如果正在使用多个工作进程,则会调用它来运行Web园。 如果是这种情况,那么在proc会话中将没有用,因为此会话不在工作进程之间共享 。 请访问http://www.west-wind.com/weblog/posts/2005/Apr/20/Why-you-shouldnt-use-InProc-Session-State-in-ASPNET

您是否在IIS中禁用了会话,这将超过规则.net。

看看这个http://technet.microsoft.com/en-us/library/cc732964(v=ws.10).aspx – 它告诉你如何禁用会话,但显示在哪里检查设置。

谢谢弗兰

默认情况下,Web服务是并且应该是无状态的。 但是,如果必须使用会话信息,请确保使用标记接口IReadOnlySessionState和IRequiresSessionState,以便访问,使用或修改Web服务中的会话状态信息。

在会话不为空之前执行此方法检查的最佳方法,在另一方面,使用您的值初始化所选会话,然后使用httpcontext.current.session的Web服务何时何地具有价值!

Web服务是无状态的,最好的方法是在Web服务中获取价值,而不是设置或初始化会话值

默认情况下,Web服务不支持Session。 您需要在Web方法属性中明确指定参数

这两件事对我有用

  1. 标记中的enableSessionState="true"