Giả sử System.Windows.Forms.WebBrowswer được sử dụng để truy cập vào một trang được bảo vệ với một liên kết bảo vệ mà bạn muốn tải về:
Mã này lấy liên kết thực tế mà bạn muốn tải về bằng cách sử dụng web trình duyệt. Mã này sẽ cần phải được thay đổi cho hành động cụ thể của bạn. Phần quan trọng là trường này là documentLinkUrl
sẽ được sử dụng bên dưới.
var documentLinkUrl = default(Uri);
browser.DocumentCompleted += (object sender, WebBrowserDocumentCompletedEventArgs e) =>
{
var aspForm = browser.Document.Forms[0];
var downloadLink = browser.Document.ActiveElement
.GetElementsByTagName("a").OfType<HtmlElement>()
.Where(atag =>
atag.GetAttribute("href").Contains("DownloadAttachment.aspx"))
.First();
var documentLinkString = downloadLink.GetAttribute("href");
documentLinkUrl = new Uri(documentLinkString);
}
browser.Navigate(yourProtectedPage);
Bây giờ trang được bảo vệ đã được điều hướng bởi trình duyệt web và liên kết tải xuống đã được mua, Mã này tải xuống liên kết.
private static async Task DownloadLinkAsync(Uri documentLinkUrl)
{
var cookieString = GetGlobalCookies(documentLinkUrl.AbsoluteUri);
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = documentLinkUrl })
{
cookieContainer.SetCookies(this.documentLinkUrl, cookieString);
var response = await client.GetAsync(documentLinkUrl);
if (response.IsSuccessStatusCode)
{
var responseAsString = await response.Content.ReadAsStreamAsync();
// Response can be saved from Stream
}
}
}
Đoạn mã trên dựa vào phương pháp GetGlobalCookies
từ Erika Chinchio có thể được tìm thấy trong các bài viết xuất sắc được cung cấp bởi @Pedro Leonardo (có sẵn here),
[System.Runtime.InteropServices.DllImport("wininet.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto, SetLastError = true)]
static extern bool InternetGetCookieEx(string pchURL, string pchCookieName,
System.Text.StringBuilder pchCookieData, ref uint pcchCookieData, int dwFlags, IntPtr lpReserved);
const int INTERNET_COOKIE_HTTPONLY = 0x00002000;
private string GetGlobalCookies(string uri)
{
uint uiDataSize = 2048;
var sbCookieData = new System.Text.StringBuilder((int)uiDataSize);
if (InternetGetCookieEx(uri, null, sbCookieData, ref uiDataSize,
INTERNET_COOKIE_HTTPONLY, IntPtr.Zero)
&&
sbCookieData.Length > 0)
{
return sbCookieData.ToString().Replace(";", ",");
}
return null;
}
Bạn có một giải pháp để cuối cùng của bạn vấn đề, làm thế nào để tải về các tập tin khi nó được tạo ra trên bay và bạn không thể xác định rằng nó là một tập tin tải về từ url? –