Câu trả lời của dlev đã kết thúc, nhưng tôi đã gặp sự cố khi triển khai giải pháp ("Tham số '{0}' không thể là chuỗi trống"), vì vậy tôi quyết định viết mã đầy đủ trong trường hợp bất kỳ ai khác có vấn đề tương tự .
Mục tiêu của tôi là nhận html dưới dạng chuỗi, nhưng tôi cần thêm cookie vào yêu cầu web. Đây là chức năng mà tải các chuỗi bằng cách sử dụng các tập tin 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;
}
}
Chúng tôi đang sử dụng mã từ câu trả lời dlev của:
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;
}
Đây là cách bạn sử dụng mã đầy đủ:
var cookieNameValues = new Dictionary<string, string>();
cookieNameValues.Add("varName", "varValue");
var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues);
Nguồn
2016-08-19 09:46:58
Điều đó sẽ rất khó, vì cookie là một khái niệm HTTP. Có lý do nào bạn cần thực hiện thay đổi này không? – dlev
@dlev - WebRequest sẽ tạo một HttpWebRequest dựa trên uri. Do đó, nếu tôi muốn giả lập đối tượng WebRequest của riêng tôi và/hoặc đăng ký uri của riêng tôi cũng trả về một WebRequest, thì tôi không muốn hạn chế phương thức chỉ làm việc với một đối tượng HttpWebRequest. –
Tôi hiểu rằng kiểu chạy 'webRequest' sẽ là' HttpWebRequest'. Nhưng việc truy cập 'CookieContainer' yêu cầu kiểu thời gian biên dịch là' HttpWebRequest'. Ngoài ra, bạn đề cập đến việc không ràng buộc bản thân với HTTP, nhưng trong trường hợp đó, cookie không có ý nghĩa nhiều, vì chúng là một cấu trúc HTTP (đó là lý do cho sự vắng mặt của chúng trên 'WebRequest' ngay từ đầu.) – dlev