2011-12-22 30 views
9

Tôi đang cố đăng nhập vào API nhà phát triển Yahoo theo chương trình. Tôi đã gặp trở ngại khi tôi không thể truy cập tất cả các tiêu đề "Set-Cookie" của HttpWebResponse.Truy xuất nhiều tiêu đề "Đặt cookie" từ HttpWebResponse

Fiddler cho tôi thấy các cookie sau trong phần đầu của câu trả lời:

Set-Cookie: B=733jjvp7f5g8f&b=4&d=1pFN8bVpYFYaPUme88.fc6ZzTSI-&s=kc&i=.1p3Ei3yvwqZjo0gcg7D; expires=Sun, 22-Dec-2013 05:33:04 GMT; path=/; domain=.yahoo.com 
Set-Cookie: F=a=GYsABKAMvTZoTcNAPKUXrclX_Hb77EA7I_62nONz8QeEwNevHwqJ_NyizED88uhv9aMx.9o-&b=3tN5; expires=Sun, 22-Dec-2013 05:33:04 GMT; path=/; domain=.yahoo.com 
Set-Cookie: Y=v=1&n=0v251rt3ifppb&l=0kii84if0h70ma/o&p=m2fvvau012000000&iz=1111&r=if&lg=en-AU&intl=au&np=1; path=/; domain=.yahoo.com 
Set-Cookie: PH=fn=jW23i4lnq1UpiP.lsuU-&l=en-AU; expires=Sun, 22-Dec-2013 05:33:04 GMT; path=/; domain=.yahoo.com 
Set-Cookie: T=z=QEs8OBQYTBPBEZq31nTCqv1MzNPBjUwTjcwMDZOTjY-&a=YAE&sk=DAAtoxgrYmWIMk&ks=EAA3Ha0H7qyCT8P3cI9NWJrIA--~E&d=c2wBTkRRNEFUSTNPVEEzTnpFNU9URS0BYQFZQUUBZwFCRFZQTkRSSjJQRVRDTEdFT0xCQ1hER0VVUQFvawFaVzAtAXRpcAF2MkNUVUEBenoBUUVzOE9CQTdF; path=/; domain=.yahoo.com 
Set-Cookie: SSL=v=1&s=kTc532PQYAe1iT.23Q55E50ZdoOAdEK_fshc3g_YZ3SxszcbuHkmpJUAQ7RT67nDNA0nXyX68um90ZuS9RQztQ--&kv=0; path=/; domain=.yahoo.com; secure; httponly 

Tuy nhiên, tôi không thể truy cập bất cứ điều gì ngoài trường hợp đầu tiên của "Set-Cookie" qua NET:

// Make the web request: 
var userAuthWebRequest = WebRequest.Create(uri) as HttpWebRequest; 
var response = userAuthWebRequest.GetResponse() as HttpWebResponse; 

// Dump the headers to debug: 
Debug.WriteLine(string.Format("Set-Cookie: {0}", response.Headers.Get("Set-Cookie"))); 

debug My lợi nhuận đầu ra:

Set-Cookie: B=733jjvp7f5g8f&b=3&s=b1; expires=Sun, 22-Dec-2013 05:33:03 GMT; path=/; domain=.yahoo.com 

Điều thú vị là, nếu tôi thực hiện một yêu cầu tương tự như Anh aders.GetValues, nó thực sự trả về hai trường hợp của "Set-Cookie" tiêu đề, mà dường như đã được nối với nhau trên:

foreach (var headerName in response.Headers.AllKeys) 
{ 
    foreach (var values in response.Headers.GetValues(headerName)) 
    { 
     Debug.WriteLine("{0}: {1}", headerName, values); 
    } 
} 

Output:

Set-Cookie: B=733jjvp7f5g8f&b=3&s=b1; expires=Sun 
Set-Cookie: 22-Dec-2013 05:33:03 GMT; path=/; domain=.yahoo.com 

Tôi đã nhìn thấy một vài khác các câu hỏi xác nhận tiêu đề thô không có sẵn thông qua đối tượng HttpWebResponse và tôi nên điều tra bằng cách sử dụng giải pháp ổ cắm. Tôi sắp kiểm tra FiddlerCore để xem tôi có may mắn không, nhưng nếu có bất cứ người nào khác, tôi rất muốn gặp họ.

Cảm ơn!

Trả lời

7

Bạn thường muốn sử dụng lớp 'CookieCollection' để xử lý phân tích cú pháp và xử lý tiêu đề bộ cookie.

Để được trợ giúp về cách thực hiện nó kiểm tra ví dụ từ MSDN (HttpWebRequest.CookieContainer):

using System.Net; 
using System; 
namespace Examples.System.Net.Cookies 
{ 
    // This example is run at the command line. 
    // Specify one argument: the name of the host to 
    // send the request to. 
    // If the request is sucessful, the example displays the contents of the cookies 
    // returned by the host. 

    public class CookieExample 
    { 
     public static void Main(string[] args) 
     { 
      if (args == null || args.Length != 1) 
      { 
       Console.WriteLine("Specify the URL to receive the request."); 
       Environment.Exit(1); 
      } 
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(args[0]); 
      request.CookieContainer = new CookieContainer(); 

      HttpWebResponse response = (HttpWebResponse) request.GetResponse(); 



      // Print the properties of each cookie. 
      foreach (Cookie cook in response.Cookies) 
      { 
       Console.WriteLine("Cookie:"); 
       Console.WriteLine("{0} = {1}", cook.Name, cook.Value); 
       Console.WriteLine("Domain: {0}", cook.Domain); 
       Console.WriteLine("Path: {0}", cook.Path); 
       Console.WriteLine("Port: {0}", cook.Port); 
       Console.WriteLine("Secure: {0}", cook.Secure); 

       Console.WriteLine("When issued: {0}", cook.TimeStamp); 
       Console.WriteLine("Expires: {0} (expired? {1})", 
        cook.Expires, cook.Expired); 
       Console.WriteLine("Don't save: {0}", cook.Discard);  
       Console.WriteLine("Comment: {0}", cook.Comment); 
       Console.WriteLine("Uri for comments: {0}", cook.CommentUri); 
       Console.WriteLine("Version: RFC {0}" , cook.Version == 1 ? "2109" : "2965"); 

       // Show the string representation of the cookie. 
       Console.WriteLine ("String: {0}", cook.ToString()); 
      } 
     } 
    } 
} 
+3

Chúc mừng @ M.Babcock. Lời khuyên này đã dẫn tôi xem lại các đối tượng yêu cầu/trả lời. Hóa ra tôi đã nhận được 302 phản hồi chuyển hướng tự động trước phản hồi 200 mà tôi đã xem lúc đầu. Các tập tin cookie đã được trên 302 phản ứng đầu tiên, nhưng không phải trên phản ứng cuối cùng, đó là lý do tại sao tôi đã không nhìn thấy chúng trước đây. Thiết lập "AllowAutoRedirect = false" trên yêu cầu ban đầu đã làm mẹo để tôi có thể xử lý các cookie trên phản hồi 302 đúng cách. – Dakkith

+0

@Dakkith - Bạn có thể xử lý chuyển hướng thủ công bằng cách đặt thuộc tính 'AllowAutoRedirect' thành false trên đối tượng HttpWebRequest của bạn, kiểm tra mã Trạng thái của phản hồi và nếu đó là chuyển hướng, hãy gửi lại yêu cầu ban đầu của bạn đến địa chỉ được chỉ định bởi tiêu đề 'location' của phản hồi. –

Các vấn đề liên quan