这很简单。
我正在从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);
}
再次感谢。
答案 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服务有一个很好的讨论:
答案 2 :(得分:1)
从第一次调用开始,在响应中查看ASP.NET_SessionId
值,默认情况下这是会话ID。
然后将其添加到下一个电话(见下文):