在c#应用程序中,如何在对web服务的两次调用之间保持会话活动?

在c#应用程序中,如何在对web服务的两次调用之间保持会话活动?,c#,asp.net,web-services,C#,Asp.net,Web Services,这很直截了当。 我正在从c#应用程序调用web服务(.asmx,启用会话) 我希望每次调用都使用与前一次相同的会话密钥(而不是每次都创建一个新的会话密钥) 这是我的(没有什么不寻常的)代码: 现在我想在同一节课上再打一次电话 添加:多亏了瓦利德的回答,我想我应该(在检索会话id后)做一些类似的事情: 再次添加:就是这样做的: if (!string.IsNullOrEmpty(currentSessionID)) { Cookie cookie = new Cookie("ASP.NET_S

这很直截了当。
我正在从c#应用程序调用web服务(.asmx,启用会话)

我希望每次调用都使用与前一次相同的会话密钥(而不是每次都创建一个新的会话密钥)

这是我的(没有什么不寻常的)代码:

现在我想在同一节课上再打一次电话

添加:多亏了瓦利德的回答,我想我应该(在检索会话id后)做一些类似的事情:
再次添加:就是这样做的:

if (!string.IsNullOrEmpty(currentSessionID))
{
  Cookie cookie = new Cookie("ASP.NET_SessionId", currentSessionID);
  cookie.Domain=myDomain;  //Will not work without this line!
  req.CookieContainer.Add(cookie);  
}

再次感谢。

如果我正确理解了问题,我相信您需要从响应(第一次调用web服务)中获取会话cookie,并在后续调用中将其添加到请求中

编辑:

使用CookieContainer是正确的方法,但请注意,这是正确的,因此您必须在发出请求之前将CookieContainer对象分配给属性(请参阅MSDN文章中的示例代码)


至于cookie名称,ASP.NET会话cookie的默认名称是ASP.NET_SessionId,但是名称可以不同,因为它可以在web.config中更改,或者它们可能不使用ASP.NET会话(例如它们自己的实现),因此您必须检查从该应用程序的域获得的cookie(您可以使用类似Fiddler的HTTP嗅探器,如果您使用FireFox或Chrome,则可以更轻松地在“选项”对话框中检查从该域获得的cookie的名称和内容)。

这里有一个关于在MSDN上使用ASP.NET会话状态和web服务的很好的讨论:


从第一次调用开始,注意响应中的
ASP.NET\u SessionId
值,默认情况下这是会话Id

然后将其添加到下一个通话中(见下文):


感谢您的输入,我向前走了几步,但又卡住了,请参阅我的编辑。很抱歉,我的编辑是否定的,但我不得不这样做。表面上看,这看起来不错。但实际上,TCP连接关闭时,会话id将无效,因此服务器将用新id替换会话id。@Aliostad:我不确定我是否准确获得了会话id您的意思是什么,但它对我有效。@Aliostad,实际上,如果您将会话cookie发送到应用程序,会话id不会更改。应用程序只有在请求中找不到会话cookie时才会创建另一个会话id。@Aliostad,HTTP是无状态的,因此TCP不会影响应用程序会话(当然,它用于与服务器的连接)。会话过期在ASP.NET中是基于时间的,因此您只需发送包含有效会话id的cookie(对于尚未过期的会话)。即使您发送了另一个会话id或获得了另一个颁发给您的会话id,只要会话未过期,您仍然可以发送旧的会话id。当然,这是假设他们使用默认的ASP.NET会话,并且没有自己的不同实现。正如我指出的,Waleed的答案将不起作用,因为会话id将被删除无效。您需要重新使用TCP连接以保持会话活动,只有在这种情况下,您才能使用会话id。@Aliostad:请参阅我的评论@Waleed的回答是的,对不起,我不知道为什么我将KeepAlive概念与ASP.NET会话混合在一起。
if (!string.IsNullOrEmpty(currentSessionID))
{
  Cookie cookie = new Cookie("ASP.NET_SessionId", currentSessionID);
  cookie.Domain=myDomain;  //Will not work without this line!
  req.CookieContainer.Add(cookie);  
}