2010-07-21 108 views
15

我有一个ASMX web服务与我的ASP.NET web应用程序一起托管。现在,我需要让用户会话进入Web服务。为了测试这个我做了这个简单的方法:在.NET中获取会话ASMX web服务

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

所以,首先我登录到我的web应用程序,然后在浏览器后藤我的互联网服务和对自动生成的测试页点击“checkSession”。我已经在3台电脑上测试过了。所有这三个工作都适用于webapp(因此会话正在创建等),其中2个返回Session [“userid”]的值调用webmethod,但是最后一台计算机返回“对象引用未设置为对象的实例“,因为Session是空的。

那么,这些计算机之间的区别是什么以及为什么我的ASP.NET应用程序可以在所有计算机上获得会话,但web服务无法通过?

+3

你如何存储你的会话?如果in-proc需要asmx webservice作为webapp运行在相同的appPool上。你是否一直在为那台机器收到会话错误? – 2010-07-21 09:03:15

+0

我真的不知道。所有即时消息都是,当他们最初在ASP.NET端登录时,我设置了: Session [“userid”] = theiridfromdb;首先,如何检查它是否在进程中,然后如何在同一个appPool中运行web服务? 是的,那台电脑总是给出错误。 – Matt 2010-07-21 09:21:11

+0

它看起来像inproc是默认的,所以是的,我正在使用它。 我正在运行这个运行IIS6的专用服务器,而ASP.NET站点和web服务是一个应用程序。就像在IIS中它们是相同的应用程序,Visual Studio将它们的后端都编译到同一个DLL中。 – Matt 2010-07-21 09:30:50

回答

3

默认情况下SessionIDs作为Cookie存储在客户端浏览器中(Session State Overview)。因此,请检查该问题计算机上的cookie是否正确创建。由于某些原因,Cookie可能被禁用?在这种情况下,当你击中该Web服务时,它不会将SessionID发送到服务器。

0

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

0

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

Web服务是无状态的,最好的办法就是在Web服务,而不是集获得价值或初始化会话值

0

默认的Web服务不支持Session。您需要明确指定的Web方法的参数属性

这两件事情对我来说

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

  2. enableSessionState="true"<page>标签

+0

这是1和2还是1或2? – 2016-02-18 11:49:58

+0

1和2;做第一步,然后在页面中启用sessionState(步骤2) – 2016-02-18 11:57:56

4

工作可能是为时已晚,但你有没有试过这个:

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

这正是我需要知道的,它修复了我的空Session问题。我只在我的方法上放置了[WebMethod(EnableSession = true)],它返回其他数据。谢谢! – 2017-07-24 23:08:41