Подтвердить что ты не робот

Как добавить файлы cookie в WebRequest?

Я пытаюсь выполнить unit test некоторый код, и мне нужно заменить это:

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

с

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

В принципе, как мне получить куки в запрос без использования HttpWebRequest?

4b9b3361

Ответ 1

На основе ваших комментариев вы можете рассмотреть возможность создания метода :

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"));

Ответ 2

WebRequest - это абстрактный класс, который не имеет свойства CookieContainer. Кроме того, вы не можете использовать коллекцию заголовков (исключение не реализовано), поэтому любая попытка, например webRequest.Headers.Add( "Cookie", "..." ), не будет выполнена.

Извините, но у вас нет возможности использовать файлы cookie с WebRequest.

Вставьте HttpWebRequest и добавьте/отредактируйте столько куки, которые вам нравятся, используя коллекцию Headers!

Ответ 3

Попробуйте что-то вроде этого:

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

Ответ 4

dlev answer закончил работу, но у меня возникли проблемы с внедрением решения ( "Параметр" {0} "не может быть пустой строкой.), поэтому я решил написать полный код, если у кого-то еще есть подобные проблемы.

Моя цель состояла в том, чтобы получить html как строку, но мне нужно было добавить файлы cookie в веб-запрос. Это функция, которая загружает строку с помощью файлов 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);