36

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

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

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

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

4

4 回答 4

39

根据您的评论,您可能会考虑编写扩展方法

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"));
于 2012-06-22T21:37:55.457 回答
7

尝试这样的事情:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/default.html");
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(new Cookie("ConstoCookie", "Chocolate Flavour"));
于 2012-06-22T21:28:25.977 回答
7

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

抱歉,您没有机会在 WebRequest 中使用 cookie。

坚持使用 HttpWebRequest 并使用其 Headers 集合添加/编辑任意数量的 cookie!

于 2012-06-22T21:39:17.190 回答
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);
于 2016-08-19T09:46:58.137 回答