2011-10-12 49 views
3

我使用Web客户端登录到WordPress的博客,我的Web客户端的方法:的CookieContainer不保存所有Cookie

protected override WebRequest GetWebRequest(Uri address) 
    { 
     WebRequest request = base.GetWebRequest(address); 

     if (request.GetType() == typeof(HttpWebRequest)) 
     { 
      ((HttpWebRequest)request).CookieContainer = cookieContainer; 
      foreach (Cookie c in cookieContainer.GetCookies(address)) 
      { 
       Console.WriteLine(" cName: " + c.Name); 
       Console.WriteLine(" cValue: " + c.Value); 
       Console.WriteLine(" cPath: " + c.Path); 
       Console.WriteLine(" cDomain: " + c.Domain); 
      } 
      ((HttpWebRequest)request).UserAgent = userAgent; 
      ((HttpWebRequest)request).Timeout = timeout; 
      ((HttpWebRequest)request).Accept = accept; 
     } 

     return request; 
    } 

    [DebuggerNonUserCode()] 
    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     try 
     { 
      WebResponse response = base.GetWebResponse(request); 

      if (response.GetType() == typeof(HttpWebResponse)) 
      { 
       foreach (Cookie c in ((HttpWebResponse)response).Cookies) 
       { 
        Console.WriteLine(" Name: " + c.Name); 
        Console.WriteLine(" Value: " + c.Value); 
        Console.WriteLine(" Path: " + c.Path); 
        Console.WriteLine(" Domain: " + c.Domain); 
       } 

       characterSet = ((HttpWebResponse)response).CharacterSet; 
      } 

      return response; 
     } 
     catch (System.Net.WebException e) 
     { 
      throw e; 
     } 
    } 

现在,当我尝试登录的WordPress派了四块饼干和302重定向

Set-Cookie: wordpress_a235c74829f55a618a01c9f088805f08=precmast%7C1318622660%7C45c78363a5062b592b1fe49201fea5a8; path=/wp-content/plugins; httponly 
Set-Cookie: wordpress_test_cookie=WP+Cookie+check; path=/ 
Set-Cookie: wordpress_a235c74829f55a618a01c9f088805f08=precmast%7C1318622660%7C45c78363a5062b592b1fe49201fea5a8; path=/wp-admin; httponly 
Set-Cookie: wordpress_logged_in_a235c74829f55a618a01c9f088805f08=precmast%7C1318622558%7Ca28c4bf14832cbbee606cdddcad9e019; path=/; httponly 

但WebResponse只包含2个cookie(wth path = /),当它自动重定向时它不会发送2个其他cookie,所以我无法登录。现在我通过处理来自response.Headers的重定向和cookie manualy [“Set-Cookie”]和response.Headers [“Location”]。但我想知道还有其他解决方案吗?

实际修复

if (response.GetType() == typeof(HttpWebResponse)) 
      { 
       if(response.Headers["Location"] != null) 
       { 

        cookieContainer.Add(response.ResponseUri, GetAllCookiesFromHeader(response.Headers["Set-Cookie"], response.ResponseUri.Host)); 

        HttpWebRequest req = (HttpWebRequest)WebRequest.Create(response.Headers["Location"]); 
        req.Method = "GET"; 
        req.AllowAutoRedirect = false; 
        req.CookieContainer = cookieContainer; 
        req.UserAgent = userAgent; 
        req.Timeout = timeout; 
        req.Accept = accept; 


        return GetWebResponse(req); 
       } 

回答

1

试试这个:

request.AllowAutoRedirect = false; 
+0

正如我所说我使用这个 - 我manualy处理cookie和重定向在GetWebResponse – ekapek

0

你想要做的是:

  • 找出 '邮报' 认为被发送到WordPress站点时您登录。
    • 'Live HTTP Headers'addo n for firefox是一个很好的检查标题。
  • 查看发布信息。
  • 然后重新使用HttpWebRequest发送该信息。
    • 这是一个真正的UserAgent字符串添加到请求一个好主意,让你看起来像一个真正的人
    • 并不重要,但其对请求的逻辑引用者是不是一个坏主意要么
  • 将您的CookieContainer附加到获取登录cookie的请求。
  • 为了没有做这个每次启动你的程序:
    • 可序列化和反序列化的CookieContainer
    • 系列化我个人成功使用的BinaryFormatter

我不确定提供的代码示例是否具有建设性。有了这些信息,了解如何自己编写代码比仅仅复制和粘贴更有价值。但是,如果你想要代码示例任何它只是留下评论。