.net HttpWebRequest未发送所有Cookie
我正在尝试让我的应用程序在外部网站上执行登录操作。我使用以下代码:.net HttpWebRequest未发送所有Cookie,.net,vb.net,cookies,httpwebrequest,.net,Vb.net,Cookies,Httpwebrequest,我正在尝试让我的应用程序在外部网站上执行登录操作。我使用以下代码: Dim enc As Encoding = Encoding.UTF8 Dim Data As Byte() = Nothing Dim req As HttpWebRequest req = CType(Net.WebRequest.Create(URL), Net.HttpWebRequest) req.Method = method req.CookieContainer = Co
Dim enc As Encoding = Encoding.UTF8
Dim Data As Byte() = Nothing
Dim req As HttpWebRequest
req = CType(Net.WebRequest.Create(URL), Net.HttpWebRequest)
req.Method = method
req.CookieContainer = CookieJar
req.AllowAutoRedirect = False
If method = "POST" Then
req.ContentType = "application/x-www-form-urlencoded"
Data = enc.GetBytes(PostData)
If Data.Length > 0 Then
req.ContentLength = Data.Length
Dim newStream As Stream = req.GetRequestStream()
newStream.Write(Data, 0, Data.Length)
newStream.Flush()
newStream.Close()
End If
End If
Dim Response As Net.HttpWebResponse = CType(req.GetResponse(), Net.HttpWebResponse)
Dim ResponseStream As IO.StreamReader = New IO.StreamReader(Response.GetResponseStream(), enc)
Dim Html As String = ResponseStream.ReadToEnd()
Response.Close()
ResponseStream.Close()
Return Html
工作原理:
- 响应具有所有正确的“Set Cookie”标题
- 容器保存所有正确的cookie(共5个)
- 容器正在正确检索所有cookie。但并不是所有的cookie都会随下一个请求一起发送。4个cookie设置正确,但最重要的cookie未发送
Set-Cookie: mpSecurity="ODc2NzM2ODoxMzUODViNTg5OWM1NTNlOWMwYmMxYjUxNWZjYzJjOGQyZGU4MTc2M2M=";Version=1;Path=/;Domain=.xxxxx.nl;Discard
此cookie与正确发送的cookie之间的唯一区别是,此cookie中包含“Version=1”和“Discard”
有人知道为什么除了上面的cookie之外,所有检索到的cookie都会被发送吗
任何帮助都将不胜感激 这是CookieContainer中常见的已知错误:对于4.0以下的.Net版本 请注意Set Cookie头的域:
Cookie # 1 -> Set-Cookie: mpSecurity="ODc2NzM2ODoxMzUODViNTg5OWM1NTNlOWMwYmMxYjUxNWZjYzJjOGQyZGU4MTc2M2M=";Version=1;Path=/;Domain=marktplaats.nl;Discard
Cookie # 2 -> Set-Cookie: mpSecurity="ODc2NzM2ODoxMzUODViNTg5OWM1NTNlOWMwYmMxYjUxNWZjYzJjOGQyZGU4MTc2M2M=";Version=1;Path=/;Domain=.marktplaats.nl;Discard
当URL格式为http://marktplaats.nl/...
当URL格式为
http://www.marktplaats.nl/...
因此问题就来了
这里是解决方案#1:(更好更简单的一个)
这里是解决方案#2:
private void BugFix_CookieDomain(CookieContainer cookieContainer)
{
System.Type _ContainerType = typeof(CookieContainer);
Hashtable table = (Hashtable)_ContainerType.InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance,
null,
cookieContainer,
new object[] { });
ArrayList keys = new ArrayList(table.Keys);
foreach (string keyObj in keys)
{
string key = (keyObj as string);
if (key[0] == '.')
{
string newKey = key.Remove(0, 1);
table[newKey] = table[keyObj];
}
}
}
解决方案的所有功劳都决定为这个/类似的案例发布另一个解决方案,以防有人发现它有用。 我也遇到了同样的问题,收到了三个cookie,只有两个显示为下一个web请求发送的cookie。我做了一些调试,发现我的错误不是域本身,正如前面的答案所示——在我的例子中,问题是返回的第三个cookie在后续请求中没有被重用,它被设置为HTTPS重定向,并且它的“Secure”属性被设置为true。所以我所要做的就是将下一个请求url从http://.... 到https://....,然后所有的cookies都被发送过来了,一切正常
希望它能帮助别人 还有一个解决方案,我在我的电脑里的某个地方[看起来像丢失的atm机]会在我找到后更新帖子!感谢AppDev的努力,但这两种解决方案都没有什么不同。我还注意到,来自同一请求、具有相同域的另一个cookie实际上在后续请求中被正确发送。它可能与版本或丢弃标记有关吗?我没有看到或听到丢弃标记,因此无法day,那么cookie是否没有发送或存在其他问题?那么一定是另一个问题,但我无法真正定义它比我在问题中的描述好多少。@kay10-从描述中可以非常清楚,+我过去处理过同样的问题,solun#1为我工作,我们会做一件事,如果可能的话,备份您的项目,升级到.net 4.0。如果问题保持不变,那么会出现一些不同的问题!
void main()
{
CookieContainer cookieJar = new CookieContainer();
ImproveCookieContainer(ref cookieJar);
// then use it with the WebRequest object
}
private void BugFix_CookieDomain(CookieContainer cookieContainer)
{
System.Type _ContainerType = typeof(CookieContainer);
Hashtable table = (Hashtable)_ContainerType.InvokeMember("m_domainTable",
System.Reflection.BindingFlags.NonPublic |
System.Reflection.BindingFlags.GetField |
System.Reflection.BindingFlags.Instance,
null,
cookieContainer,
new object[] { });
ArrayList keys = new ArrayList(table.Keys);
foreach (string keyObj in keys)
{
string key = (keyObj as string);
if (key[0] == '.')
{
string newKey = key.Remove(0, 1);
table[newKey] = table[keyObj];
}
}
}