Я только начал экспериментировать с C # WebClient
. У меня есть код ниже, который получает html-код с веб-сайта и записывает его в .txt-файл. Единственная проблема, с которой я сталкиваюсь, заключается в том, что на некоторых веб-сайтах вам необходимо принять cookies, прежде чем вы сможете использовать веб-сайт. Это связано с тем, что вместо написания реального 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); }
Итак, каково решение этого? Может ли кто-нибудь направить меня на правильный путь?
Применение :
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.
Просто сохраните строку 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; }
Это может быть близким дублированием. Как я могу заставить WebClient использовать Cookies?
Вопрос, на который я ссылался выше, для VB.NET, но механизм должен быть тем же самым для C #. Я подозреваю, что поведение, которое вы видите, означает, что веб-сайт отправляет куки-файл, а затем запрашивает его, но ваш клиент не настроен на возврат cookie на сервер, поэтому он интерпретирует это, поскольку вы не принимаете cookies ».
Используете ли вы инструмент анализа, например Fiddler, для анализа того, что сообщается / от вашего клиента?
Вам также может потребоваться отправить определенный HTTP-заголовок, чтобы указать, что вы принимаете cookies, но я не помню, что это было необходимо в моем прошлом опыте.