Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net HttpWebRequest未发送所有Cookie_.net_Vb.net_Cookies_Httpwebrequest - Fatal编程技术网

.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未发送
未发送的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:
  • 不要使用.Add(Cookie),只使用.Add(Uri,Cookie)方法
  • 每次向容器或应用程序添加cookie时,请调用BugFix_CookieDomain 在使用.GetCookie之前或在系统使用容器之前

    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];
            }
        }
    }