在HttpWebResponse上访问ASP.NET_SessionId C#

时间:2016-11-15 18:31:46

标签: c# iis httpwebresponse setcookie sessionid

我正在尝试从HttpWebResponse获取ASP.NET_SessionId,但似乎响应中没有这样的数据。 基本上我正在尝试模拟某些页面上的某些步骤,需要进行身份验证。问题不在于身份验证,我的问题是在身份验证后获取ASP.NET_SessionId,因此我可以在将来的请求/步骤中使用它。

Chrome上的开发者工具>在网络上,我可以看到标题上的ASP.NET_SessionId,但它没有出现在我的HttpWebResponse中。任何想法为什么会这样? 有我的代码:

 var httpWebRequest              = (HttpWebRequest) WebRequest.Create(url);
 httpWebRequest.UserAgent        = "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.93 Safari/537.36";             httpWebRequest.Method           = "POST";
 httpWebRequest.ContentType      = "application/x-www-form-urlencoded";
 httpWebRequest.ContentLength    = 0;
 var httpWebResponse             = (HttpWebResponse) httpWebRequest.GetResponse();

在我的请求之后,我应该看到一个ASP.NET_SessionId标头Set-Cookie,但没有运气。任何想法?

我见过有人说过

httpWebResponse.Headers["ASP.NET_SessionId"]

httpWebResponse.Headers["SESSION_ID"]

应该可以工作但是没有,没有设置会话ID标头也没有任何Cookie。

1 个答案:

答案 0 :(得分:3)

经过多次研究,答案是here

基本上我们必须在所有请求中保持相同的CookieContainer对象引用。我从响应中提取了一些Set-Cookie并将它们添加到我的请求中,但现在我不需要做任何事情,CookieContainer透明地管理所有这些。

来自回复的Set-Cookie在请求的CookieContainer上设置。这是他们发现解决可能的安全问题的方式,因此不要浪费更多时间,只是保留对CookieContainer的引用,因为您将无法访问会话ID(并且您不需要它)。

现在有我的代码示例。

var cookieContainer = new CookieContainer();

var httpWebRequest1 = (HttpWebRequest) WebRequest.Create(url);
httpWebRequest1.CookieContainer = cookieContainer;

// do the request and some logic

var httpWebRequest2 = (HttpWebRequest) WebRequest.Create(anotherUrl);
httpWebRequest2.CookieContainer = cookieContainer; // same cookieContainer reference

现在一切都很好,希望它有助于某人。