WebService的session问题:一个connector能否连续调用WebService?

弦苦 2009-04-28 02:45:30
我在服务端定义了Login、WebMethod1、WebMethod2……。
客户端调用WebMethod1、WebMethod2……之前要先调用Login进行登陆校验,若登陆校验成功,在Login中置Session["Login"]=true,否则置Session["Login"]=false。
然后其他的WebMethod中都检查Session["Login"],这样实现一次登录后持续使用WebService。
我在Web浏览器中测试都没问题。

现在我用VC++6.0客户端调用Login实现登陆后再调用其他WebService,发现都新开一个session,相当于新开一个浏览器进程,前面的session消失了!
VC中使用SOAP每次调用WebService的大致过程是:
Connector.CreateInstance(__uuidof(HttpConnector30));
Connector->Property["EndPointURL"] = "http://localhost/WebServiceTest2/Service.asmx";
Connector->Connect();
Connector->Property["SoapAction"] = "http://Fantasy/WebServiceTest2/Hello1";
Connector->BeginMessage();
Serializer.CreateInstance(__uuidof(SoapSerializer30));
Serializer->Init(_variant_t((IUnknown*)Connector->InputStream));
Serializer->StartEnvelope("","","");
现在的问题是如何保持一个Connector,使VC中所有的WebService调用都在一次Session中完成呢?
有没用遇到过这方面问题的同仁,希望指点一二,谢谢~
...全文
322 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
弦苦 2009-05-03
  • 打赏
  • 举报
回复
hi,wuding。
要是在C#的Web程序中cookie和session很好处理,关键我现在客户端使用VC做的,通过SOAP调用ASP.NET的WebService。经验证,SOAP中的HTTPConnection是无法保持状态的。我在一次HTTPConnection中可以有多个SOAPAction,但每个独立的WebService若在不同的HTTPConnection中调用,则它们建立了不同的session。
其实我这个项目中除了调用WebService外,还涉及到登陆网站的问题,一次登录网站或WebService,后面就不用再登陆,这个涉及到后台里面不同Web站点之间的Session共享问题。有人推荐用SharePoint,single sign-on,有点类似.NET Passport,所以现在在研究这个了。。。
wuding1104 2009-05-01
  • 打赏
  • 举报
回复
在客户端要设置Websercive 的CookieContainer 如下(C#)
localhost.YourService Ys = new localhost.YourService();
Ys.CookieContainer = new System.Net.CookieContainer();

Ys.Login("test","test");
Ys.WebMethod();
wuding1104 2009-05-01
  • 打赏
  • 举报
回复
在客户端要设置Websercive 的CookieContainer 如下(C#)
localhost.YourService Ys = new localhost.YourService();
Ys.CookieContainer = new System.Net.CookieContainer();

Ys.Login("test","test");
Ys.WebMethod();
弦苦 2009-04-29
  • 打赏
  • 举报
回复
hi,ecitzyp,我WebService是采用ASP.NET2.0编写的(HTTP/1.1)。
[WebMethod(EnableSession = true, Description = "授权验证")]
public string Login(string UserName, string PassWord)
{
if (UserName == "Fantasy" && PassWord == "0505")
Session["Login"] = true;
else
Session["Login"] = false;
return Session.SessionID;
}

[WebMethod(EnableSession=true, Description = "测试1")]
public string Hello1()
{
//这里就是判断Session值,即有没有通过验证。每个方法前都需要判断下
if (Session["Login"] != null && Session["Login"].ToString() == "True")
return Session.SessionID;
else
return "UnLogin";
}
VC通过SOAP调用WebService,这个估计是SOAP内部机制问题,因为http无状态,发现每一次调用WebService就建立一次HTTPConnection。
(1)我试图声明一个全局的ISoapConnectorPtr Connector;
CoInitialize(NULL);
ISoapConnectorPtr Connector;
Connector.CreateInstance(__uuidof(HttpConnector30));
Connector->Property["EndPointURL"] = "http://localhost/WebServiceTest/Service.asmx";
Connector->Connect();
然后每次调用WebService都使用这个Connector进行,但以失败告终。
(2)在(1)的基础上,我添加Connector->Property["ConnectTimeout"]=_variant_t(long(99999));每次调用都是用这个Connector。发现只要在99999ms内连续调用Login、Hello1……,服务器返回的都是同一session。当然运行期间出现了一些异常。由此看来主要还是soap里每一次Connector.CreateInstance(__uuidof(HttpConnector30));和Connector->Connect();只能支持一个SoapAction?
看来VC通过SOAP来维持Webservice的通信状态不可行?
ecitzyp 2009-04-29
  • 打赏
  • 举报
回复
启用多线程,或者使用数组吧

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧