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

时间:2010-10-05 10:07:41

标签: c# asp.net web-services

这很简单。
我正在从c#应用程序调用Web服务(.asmx,启用会话)。

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

这是我的(没有什么特别的)代码:

public string invokeMethod(string methodUrl)
{
 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(methodUrl);
 req.Method = "GET";
 req.ContentLength = 0;
 var result = new StringBuilder();
 using (HttpWebResponse res = (HttpWebResponse)req.GetResponse())
 {
   StreamReader sr = new StreamReader(res.GetResponseStream());
   result.Append(sr.ReadToEnd());
 }
 return result.ToString();
}  

现在我想在同一个会话中再次调用它。

已添加:感谢 Waleed 的回答,我认为我应该做的(在检索会话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);  
}

再次感谢。

3 个答案:

答案 0 :(得分:1)

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

编辑:

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

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

答案 1 :(得分:1)

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

http://msdn.microsoft.com/en-us/library/aa480509.aspx

答案 2 :(得分:1)

从第一次调用开始,在响应中查看ASP.NET_SessionId值,默认情况下这是会话ID。

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

http://support.microsoft.com/?kbid=899918