如何将Cookie添加到WebRequest?

时间:2012-06-22 21:18:31

标签: c# .net unit-testing

我正在尝试对一些代码进行单元测试,我需要替换它:

  HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create( uri );
  httpWebRequest.CookieContainer = new CookieContainer();

  WebRequest webRequest = WebRequest.Create( uri );
  webRequest.CookieContainer = new CookieContainer(); 

基本上,如何在不使用HttpWebRequest的情况下将cookie添加到请求中?

4 个答案:

答案 0 :(得分:29)

根据您的评论,您可以考虑撰写extension method

public static bool TryAddCookie(this WebRequest webRequest, Cookie cookie)
{
    HttpWebRequest httpRequest = webRequest as HttpWebRequest;
    if (httpRequest == null)
    {
        return false;
    }

    if (httpRequest.CookieContainer == null)
    {
        httpRequest.CookieContainer = new CookieContainer();
    }

    httpRequest.CookieContainer.Add(cookie);
    return true;
}

然后您可以使用以下代码:

WebRequest webRequest = WebRequest.Create( uri );
webRequest.TryAddCookie(new Cookie("someName","someValue"));

答案 1 :(得分:6)

WebRequest是一个没有CookieContainer属性的抽象类。此外,您不能使用Headers集合(未实现的异常),因此任何类似webRequest.Headers.Add(“Cookie”,“...”)的尝试都将失败。

抱歉,您没有机会在WebRequest上使用Cookie。

坚持使用HttpWebRequest并使用其Headers系列添加/编辑您喜欢的多个Cookie!

答案 2 :(得分:3)

尝试这样的事情:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/default.html");
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(new Cookie("ConstoCookie", "Chocolate Flavour"));

答案 3 :(得分:1)

dlev的答案最终得到了解决,但我在实施解决方案时遇到了问题("参数' {0}'不能是空字符串。"),所以我决定编写完整的代码以防其他人有类似的问题。

我的目标是将html作为字符串,但我需要将cookie添加到Web请求中。这是使用cookie下载字符串的功能:

public static string DownloadString(string url, Encoding encoding, IDictionary<string, string> cookieNameValues)
{
    using (var webClient = new WebClient())
    {
        var uri = new Uri(url);
        var webRequest = WebRequest.Create(uri);
        foreach(var nameValue in cookieNameValues)
        {
            webRequest.TryAddCookie(new Cookie(nameValue.Key, nameValue.Value, "/", uri.Host));
        }                
        var response = webRequest.GetResponse();
        var receiveStream = response.GetResponseStream();
        var readStream = new StreamReader(receiveStream, encoding);
        var htmlCode = readStream.ReadToEnd();                
        return htmlCode;
    }
}   

我们正在使用dlev答案中的代码:

public static bool TryAddCookie(this WebRequest webRequest, Cookie cookie)
{
    HttpWebRequest httpRequest = webRequest as HttpWebRequest;
    if (httpRequest == null)
    {
        return false;
    }

    if (httpRequest.CookieContainer == null)
    {
        httpRequest.CookieContainer = new CookieContainer();
    }

    httpRequest.CookieContainer.Add(cookie);
    return true;
}

这是您使用完整代码的方式:

var cookieNameValues = new Dictionary<string, string>();
cookieNameValues.Add("varName", "varValue");
var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues);