Почему request.Headers.Add (& ldquo; Cookie & rdquo ;, & ldquo; & hellip; & rdquo;) не имеет никакого эффекта? [Дубликат]

В качестве резервной копии JavaScript (или вашего единственного решения) вы можете использовать мой плагин jQuery Scalem , который позволяет масштабировать относительно родительского элемента (контейнера), передавая параметр reference.

23
задан leppie 27 January 2016 в 17:27
поделиться

4 ответа

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

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"));
25
ответ дан Rana 20 August 2018 в 10:17
поделиться
  • 1
    Этот код возвращает: & quot; Параметр '{0}' не может быть пустой строкой. & Quot; on line httpRequest.CookieContainer.Add (cookie) ;. Есть идеи? – user 22 June 2012 в 22:58
  • 2
    @drdigit Это потому, что вы не создали cookie, который включал в себя домен. Кроме того, я уверен, что строка ошибки является ошибкой в ​​BCL (которая, к сожалению, сохраняется в версии 4.5) – dlev 22 June 2012 в 23:05
  • 3
    Большое спасибо за подробный ответ. – user 22 June 2012 в 23:08
  • 4
    @drdigit Нет проблем. Спасибо за (возможно, непреднамеренный) отчет об ошибке! – dlev 22 June 2012 в 23:12
  • 5
    У меня была та же проблема & quot; Параметр '{0}' не может быть пустой строкой. & Quot; Как заявил Длев, это связано с тем, что домен не был включен. Однако я запускаю все на localhost во время разработки ( localhost: 50665 ). Итак, для моего объекта Cookie с именем «cookie» я добавил домен «localhost» и исправил его. Правильный оператор читает cookie.Domain = "localhost". Обратите внимание, что я ранее пробовал cookie.Domain = "localhost: 50665" и это не сработало, также я попробовал cookie.Domain = & quot; localhost: 50665 & quot; / g1]; и это тоже не сработало. Вам нужно просто использовать «localhost». Надеюсь, это поможет следующему парню. – Gary 18 July 2013 в 07:40

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

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/default.html");
request.CookieContainer.Add(new Cookie("ConstoCookie", "Chocolate Flavour"));
2
ответ дан Peter Mortensen 20 August 2018 в 10:17
поделиться
  • 1
    Вопрос заключается не в настройке cookie на Response. Речь идет о создании нового WebRequest и настройке файла cookie для этого запроса (и просмотра тегов вопроса, выполняющих запрос из модульного теста). – Marek Musielak 22 June 2012 в 22:31
  • 2
    это вызовет ошибку Object reference not set to an.... Сначала нам может понадобиться request.CookieContainer = new CookieContainer();, тогда вызов метода Add должен работать. – shashwat 4 November 2012 в 08:46

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

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

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

6
ответ дан user 20 August 2018 в 10:17
поделиться
  • 1
    Вот чего я боялся. – O.O 22 June 2012 в 22:41
  • 2
    Я этого не делал :) Your & quot; if then addcookies & quot; требование может быть покрыто HttpWebRequest.Headers.Add («Cookie», «...»). – user 22 June 2012 в 22:46

Ответ dlev закончил работу, но у меня возникли проблемы с реализацией решения («Параметр« {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);
0
ответ дан Xavier Peña 20 August 2018 в 10:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: