检索多个"Set-Cookie".HttpWebResponse的标头 [英] Retrieving multiple "Set-Cookie" headers from a HttpWebResponse

查看:63
本文介绍了检索多个"Set-Cookie".HttpWebResponse的标头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试以编程方式登录Yahoo开发人员API.我遇到了一个绊脚石,在这里我无法访问HttpWebResponse的所有"Set-Cookie"标头.

I'm attempting to programmatically log in to the Yahoo developer API. I've hit a stumbling block where I can't access all of the "Set-Cookie" headers of a HttpWebResponse.

Fiddler在响应的标题中向我显示了以下cookie:

Fiddler shows me the following cookies in the header of the response:

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

但是,我无法通过.NET访问除"Set-Cookie"的第一个实例之外的任何内容:

However, I'm unable to access anything beyond the first instance of "Set-Cookie" via .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")));

我的调试输出返回:

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

有趣的是,如果我对Headers.GetValues进行类似的请求,它实际上会返回"Set-Cookie"标头的两个实例,这些实例似乎在上面串联在一起:

Interestingly, if I make a similar request to Headers.GetValues, it actually returns two instances of the "Set-Cookie" header, which appear to have been concatenated together above:

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

输出:

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

我还看到了其他一些问题,这些问题可以通过HttpWebResponse对象确认原始标头不可用,我应该使用套接字解决方案进行调查.我将要检查FiddlerCore,以查看是否有运气,但是如果有人有其他指针,我很乐意看到它们.

I've seen a few other questions that confirm the raw headers aren't available via the HttpWebResponse object, and I should investigate using a sockets solution. I'm about to check out FiddlerCore to see if I have any luck with that, but if anyone has any other pointers I'd love to see them.

谢谢!

推荐答案

您通常需要使用

You'll typically want to use the 'CookieCollection' class to handle parsing and handling the set-cookie headers.

有关如何实现它的帮助,请从MSDN中查看示例( HttpWebRequest.CookieContainer ):

For help on how to implement it check out the example from 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());
            }
        }
    }
}

这篇关于检索多个"Set-Cookie".HttpWebResponse的标头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆