在WebService中使用Session的问题 http://www.x2blog.cn/BoyTNT/?tid=6599

转载 2007年09月27日 11:53:00
[系统环境]
    ASP.Net 1.1 环境, 站点A运行WebService,站点B通过本地代理类调用A的服务,两者位于同一台服务器上,只不过是独立的两个WebApplication。

[问题描述]
    出于安全性考虑,设计了如下的服务请求流程:
    B向A发送密码登录 → A检查密码并置Session → B请求A的服务 → A检查Session后处理请求

    实际测试中发现A置Session成功,但B向A请求服务时,Session检查失败。

[解决过程]
    首先检查“[WebMethod(EnableSession=true)]”标记,发现都写了,看来问题不是出在这里。
    然后是在Visual Studio中跟踪,在B端下断点F11,可以看到A端的WebService中置Session成功,但处理请求之前的检查时Session又为null了。
    使用IE直接测试,用同一浏览器先向A发送密码登录,然后调用A的服务,这回成功了,看来问题出在调用环节上。

    回来考虑Session的实现原理,服务端能识别出客户端,是靠将一个唯一ID串发给客户端,客户端下次请求时还使用这个ID,服务端就可以识别出它了。
    基于上面的测试,IE可以而代码不行,猜测有可能是接收或发送这个ID串的环节出现了问题。
    代理类是从System.Web.Services.Protocols.SoapHttpClientProtocol派生的,于是在MSDN上查了一下相关属性和方法,与Cookie相关的有一个属性:

public CookieContainer CookieContainer {get; set;}

属性值
    CookieContainer,它表示 Web 服务客户端的 Cookie。

备注
    如果 XML Web services 方法使用会话状态,则将在响应标头中将一个为 XML Web services 客户端唯一标识会话的 Cookie 传递回该 XML Web services 客户端。为了使 XML Web services 维护客户端的会话状态,客户端必须保持 Cookie。客户端可以通过在调用 XML Web services 之前创建 CookieContainer 的新实例并将其分配给代理类的 CookieContainer 属性来接收 HTTP Cookie。若需在代理类实例超出范围时维护会话状态,客户端必须在 XML Web services 调用之间保持 HTTP Cookie。例如,Web 窗体客户端可以通过在自己的会话状态中保存 CookieContainer 来保持 HTTP Cookie。因为并非所有 XML Web services 都使用会话状态,因而并不总是要求客户端使用客户端代理的 CookieContainer 属性,所以 XML Web services 文档应该说明是否使用会话状态。

    这下看得很明白了,就是因为没有置这个CookieContainer,导致A返回的Cookie信息没有记录下来,第二次请求时不使用此Cookie值,就造成了A无法识别B。解决方法也就出来了,由于我需要一次登录多次调用,所以生成一个全局静态的CookieContainer对象供各个代理类调用就可以了,再次测试通过。

相关文章推荐

使用 XStream 把 Java 对象序列化为 XML(本文转载自http://www.ibm.com/developerworks/cn/xml/x-xstream/)

XStream两分钟教程(译) Posted on 2007-05-08 18:14 qiyadeng 阅读(17057) 评论(8)  编辑  收藏   两分钟教程   这是一个关于XSt...

X264结构体中的变量解释 转自:http://www.chinavideo.org/viewthread.php?tid=8345&extra=page%3D8

转自:http://www.chinavideo.org/viewthread.php?tid=8345&extra=page%3D8 typedef struct x264_param_t...
  • jubincn
  • jubincn
  • 2011年11月02日 15:37
  • 9224

Terry Deng的BLOG(主页:http://www.aspxcn.com.cn)

针对ASP.NET页面实时进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)      在介绍之前,先简单说一说ASP.NET服务端GZIP压缩模块的作用及工作原理,很多人编写网...
  • tuwen
  • tuwen
  • 2012年10月03日 12:37
  • 2834

cookie和session的区别的理解(http://www.jz123.cn/text/196.html)以及页面间数据的传递

先说session 对SESSION的争论好象一直没有停止过,不过幺麽能理解SESSION的人应该占90以上。 但还是讲讲,别嫌老~ 有一些人赞成用SESSION,有一些人不赞成。但这个...

Android中Uri的使用转自http://blog.sina.com.cn/s/blog_821e2bb10100spxv.html

1.Uri 通用资源标志符(Universal Resource Identifier, 简称"URI")。 Uri代表要操作的数据,Android上可用的每种资源 - 图像、视频片段等都...

http://www.oracle.com/technetwork/cn/articles/hunter-rac11gr2-iscsi-3-092230-zhs.html#30

在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 集群(续)  本指南中的信息未经 Oracle 验证,且不受 Oracle 支持,您...

委托模式(转自:http://www.uml.org.cn/j2ee/200411036.htm)

委托模式透明 选择自 www.c-view.org 梗概委托是对一个类的功能进行扩展和复用的方法。它的做法是:写一个附加的类提供附加的功能,并使用原来的类的实例提供原有的功能。 场景扩展和复用一个类的...

重学C++(2)——指向类成员的指针(转自:http://www.wangchao.net.cn/bbsdetail_73812.html)

class A   {    int _val;    int val();   };   int (A::*p_val) = &A::_val;   int ( A::*p_func )() = &...
  • lslxdx
  • lslxdx
  • 2011年10月16日 21:58
  • 637

缓存(http://www.infoq.com/cn/articles/misunderstanding-using-cache-2)

缓存大量的数据集合,而读取其中一部分 在很多时候,我们往往会缓存一个对象的集合,但是,我们在读取的时候,只是每次读取其中一部分。 我们举个例子来说明这个问题(例子可能不是很恰当,但是足以说明...
  • tyb1222
  • tyb1222
  • 2012年05月30日 20:57
  • 482
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在WebService中使用Session的问题 http://www.x2blog.cn/BoyTNT/?tid=6599
举报原因:
原因补充:

(最多只允许输入30个字)