Принимать Cookies в WebClient?
Я только начал экспериментировать с С# WebClient
. У меня есть код ниже, который получает html-код с веб-сайта и записывает его в .txt файл. Единственная проблема, с которой я сталкиваюсь, заключается в том, что на некоторых веб-сайтах вам необходимо принять файлы cookie, прежде чем вы сможете использовать веб-сайт. Это связано с тем, что вместо написания реального HTML-кода веб-сайта в файл .txt он записывает код cookie popt html.
код:
string downloadedString;
System.Net.WebClient client;
client = new System.Net.WebClient();
//"http://nl.wikipedia.org/wiki/Lijst_van_spelers_van_het_Nederlands_voetbalelftal"
downloadedString = client.DownloadString(textBox1.Text);
using (StreamWriter write = new StreamWriter("Data.txt"))
{
write.Write(downloadedString);
}
Итак, каково решение этого? Может ли кто-нибудь привести меня к правильному пути?
Ответы
Ответ 1
Использование:
CookieContainer cookieJar = new CookieContainer();
cookieJar.Add(new Cookie("my_cookie", "cookie_value", "/", "mysite"));
CookieAwareWebClient client = new CookieAwareWebClient(cookieJar);
string response = client.DownloadString("http://example.com/response_with_cookie_only.php");
public class CookieAwareWebClient : WebClient
{
public CookieContainer CookieContainer { get; set; }
public Uri Uri { get; set; }
public CookieAwareWebClient()
: this(new CookieContainer())
{
}
public CookieAwareWebClient(CookieContainer cookies)
{
this.CookieContainer = cookies;
}
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
if (request is HttpWebRequest)
{
(request as HttpWebRequest).CookieContainer = this.CookieContainer;
}
HttpWebRequest httpRequest = (HttpWebRequest)request;
httpRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
return httpRequest;
}
protected override WebResponse GetWebResponse(WebRequest request)
{
WebResponse response = base.GetWebResponse(request);
String setCookieHeader = response.Headers[HttpResponseHeader.SetCookie];
//do something if needed to parse out the cookie.
if (setCookieHeader != null)
{
Cookie cookie = new Cookie(); //create cookie
this.CookieContainer.Add(cookie);
}
return response;
}
}
Вы увидите два переопределенных метода для GetWebRequest и GetWebResponse. Эти методы можно переопределить для обработки контейнера файлов cookie.
Ответ 2
Просто сохраните строку cookie из заголовков в свой локальный сеанс. _cookies string
if (System.Web.HttpContext.Current.Session["cookie"] != null)
_cookies = System.Web.HttpContext.Current.Session["cookie"].ToString();
using (WebClient wc = new WebClient())
{
wc.Headers.Add("Cookie", _cookies);
string HtmlResult = wc.UploadString(bridge_url, myParameters);
_cookies = wc.ResponseHeaders["Set-Cookie"];
Debug.WriteLine("Headers" + _cookies);
System.Web.HttpContext.Current.Session["cookie"] = _cookies;
}
Ответ 3
Это может быть двойной дубликат Как я могу заставить WebClient использовать Cookies?
Вопрос, на который я ссылался выше, для VB.NET, но механизм должен быть таким же для С#. Я подозреваю, что поведение, которое вы видите, это веб-сайт, который отправляет куки файл, а затем запрашивает его, но ваш клиент не настроен на возврат cookie на сервер, поэтому он интерпретирует это, поскольку вы не принимаете файлы cookie. '
Используете ли вы инструмент анализа, например Fiddler, для анализа того, что сообщается/от вашего клиента?
Вам также может потребоваться отправить определенный HTTP-заголовок, чтобы указать, что вы принимаете файлы cookie, но я не помню, что это было необходимо в моем прошлом опыте.