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

23

我的ASP.NET Web应用程序中托管了一个ASMX Web服务。现在,我需要将用户会话传递给这个Web服务。为了测试这个功能,我创建了以下简单方法:

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

首先,我登录到我的Web应用程序,然后在浏览器中转到我的WebService,并在那个自动生成的测试页面上单击“checkSession”。我已经在3台计算机上进行了测试。这3台计算机都可以正常使用Web应用程序(因此会创建会话等),其中2台在调用Web方法时返回Session ["userid"]的值,但是最后一台计算机返回“Object reference not set to an instance of an object”,因为Session为null。

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


3
你是如何存储会话的?如果是在进程内,你需要让asmx Web服务与Web应用程序在同一appPool上运行。你是否一直在那台机器上出现会话错误? - Mikael Svenson
我其实不知道。我所做的就是当他们最初在ASP.NET端登录时,我设置: Session["userid"] = theiridfromdb; 首先,我该如何检查它是否为in-proc,然后如何在同一appPool中运行webservice? 是的,那台电脑总是出错。 - Matt
看起来inproc是默认设置,所以是的,我正在使用它。我正在运行一个专用服务器,运行IIS6,ASP.NET站点和Web服务是一个应用程序。也就是说,在IIS中它们是同一个应用程序,并且Visual Studio将它们的后端编译为相同的DLL。 - Matt
请查看此帖子:启用会话的 Web 服务- http://www.devhood.com/messages/message_view-2.aspx?thread_id=50261 - Markive
2
另外需要注意的是 - 你不应该在一个可能为空的对象上调用ToString()方法 - 应该先检查是否为null。 - Ashish Gupta
显示剩余2条评论
8个回答

18

或许现在已经太晚了,但你试过这个吗:

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

3
这正是我需要了解的,并解决了我的空会话问题。我只需在返回其他数据的方法上放置[WebMethod(EnableSession = true)]即可。谢谢! - Daniel Williams

3

3

默认情况下,SessionIDs会以cookie的形式存储在客户端浏览器中(Session State Overview)。因此,请检查该问题计算机上是否正确创建了该cookie。也许由于某些原因禁用了cookie?在这种情况下,当您访问该Web服务时,不会将SessionID发送到服务器。


1

0

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

这两个方法对我有用

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

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


这是1 AND 2,还是1 OR 2? - Greg Woods
1和2;先执行第一步,然后在页面中启用sessionState(第二步)。 - panky sharma

0

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


0

会话对象可以通过以下方式访问:

var session = this.Session;
var contextSession = this.Context.Session;

-1

在编程中,检查会话是否为空是一种最好的方法。你可以先检查会话是否为空,然后用你的值初始化所选的会话。当 Web 服务使用 httpcontext.current.session 时,确保有值!

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接