【参加讨论】当设置一个http cookie,你可以指定其过期时间。过期时间指定在多久的时间内,客户端应该将该cookie回传给服务器。如果一个cookie没有被设置过期时间,那么它仅仅在该进程处理请求的时间内被回传。例如,ie将一直回传cookie,除非你关闭了浏览器的特定窗口。asp.net的用来保存会话id的cookie没有过期时间,因此,如果一台客户机上的多个进程向你的服务器上发送http请求,它们也不会共享同一个httpsessionstate对象,甚至两个进程同时运行也是这样。如果你要处理来自同一个进程的并发的web service调用,那么这些请求将在服务器上被排序,从而使得在某一时刻只有一个请求被执行。asp.net的web service不像普通.aspx页面,支持允许多请求的并发进程的对httpsessionstate对象的只读访问,所有session被激活的web方法调用都具有read/write访问的权限,因此必须对之进行排序。
客户端的问题
在你的webservice中成功的使用httpsessionstate的功能事实上依赖于对用户的一些假设。首先,也是最重要的一点,如果你是用默认的http cookie模式来保存session状态,你的客户端就必须支持cookie;如果你是用无cookie的机制来支持session,那么你的客户端必须能够并且愿意重定向到一个新的url,该url由原来的url中插入会话id而得到。结果将表明,这并不是一个无足轻重的问题,它关系到你能否成功地部署你的程序。
所有工作都依赖于浏览器
如果你是用microsoft visual studio.net来开发asp.net web service应用程序,那么默认的调试方法就是打开ie访问你的.asmx文件。通常,系统将提供一个可以调用你的web方法的友好的界面,这是一个调试你的web service代码的很好的途径。如果你已经将web方法的enablesession选项设置为true,它被非常漂亮地支持,甚至如果你打开了无cookie的session支持,客户端浏览器也可以完美地完成这项工作,你的session对象将如你所愿地工作。
然而,大多数的web service请求不是来自浏览器,而是来自应用程序中的web引用。我们如何使用.net框架的“添加web引用”的特性呢?让我们来看一看。
添加web引用的问题
我将使用我们前面看到的代码段来创建一个简单的xml web service。记起来了吧?这个web方法被称作incrementsessioncounter,它仅仅是简单地把一个整数存储在httpsessionstate对象中,然后每次调用则将它加1,并且返回当前值。从客户端浏览器我们可以看到这个数字的值随着调用次数的增加而增加。