Saya sebelumnya menggunakan CookieContainer dengan sesi HttpWebRequest dan HttpWebResponse, tapi sekarang, saya ingin menggunakannya dengan WebClient. Sejauh yang saya mengerti, tidak ada metode built-in seperti ada untuk HttpWebRequests ( request.CookieContainer
). Bagaimana saya bisa mengumpulkan cookie dari WebClient di CookieContainer?
Saya mencari di Google untuk ini dan menemukan sampel berikut :
public class CookieAwareWebClient : WebClient
{
private readonly CookieContainer m_container = new CookieContainer();
protected override WebRequest GetWebRequest(Uri address)
{
WebRequest request = base.GetWebRequest(address);
HttpWebRequest webRequest = request as HttpWebRequest;
if (webRequest != null)
{
webRequest.CookieContainer = m_container;
}
return request;
}
}
Apakah ini cara terbaik untuk melakukannya?
c#
cookies
httpwebrequest
webclient
cookiecontainer
Maxim Zaslavsky
sumber
sumber
m_container
tidak pernah diatur !? Bukankah selalu kosong?Jawaban:
Iya. IMHO, mengesampingkan GetWebRequest () adalah solusi terbaik untuk fungsionalitas terbatas WebClient. Sebelum saya tahu tentang opsi ini, saya menulis banyak kode yang sangat menyakitkan di lapisan HttpWebRequest karena WebClient hampir, tetapi tidak cukup, melakukan apa yang saya butuhkan. Penurunan jauh lebih mudah.
Opsi lain adalah dengan menggunakan kelas WebClient biasa, tetapi secara manual mengisi header Cookie sebelum membuat permintaan dan kemudian menarik header Set-Cookies pada respon. Ada metode pembantu pada kelas CookieContainer yang membuat membuat dan mengurai header ini lebih mudah:
CookieContainer.SetCookies()
danCookieContainer.GetCookieHeader()
, masing-masing.Saya lebih suka pendekatan yang pertama karena lebih mudah untuk penelepon dan membutuhkan kode berulang lebih sedikit daripada opsi kedua. Juga, pendekatan derivasi bekerja dengan cara yang sama untuk beberapa skenario perluasan (misalnya cookie, proksi, dll.).
sumber
Dari Komentar
Bagaimana Anda memformat nama dan nilai cookie sebagai ganti "somecookie"?
Untuk banyak cookie:
sumber
Yang ini hanyalah perpanjangan dari artikel yang Anda temukan.
sumber
readonly
pengubahcontainer
bidang, jika tidak, Anda tidak dapat mengaturnya di properti. Saya memodifikasi kodenya.Set-Cookie
tajuk respons diReadCookies
?GetWebResponse
danReadCookies
, karena cookie akan ditambahkan ke wadah secara otomatis.HttpWebRequest memodifikasi CookieContainer yang ditugaskan padanya. Tidak perlu memproses cookie yang dikembalikan. Cukup tetapkan wadah cookie Anda untuk setiap permintaan web.
sumber
Saya pikir ada cara yang lebih bersih di mana Anda tidak harus membuat klien web baru (dan itu akan bekerja dengan perpustakaan pihak ke-3 juga)
Sekarang yang harus Anda lakukan adalah memilih di mana Anda ingin menggunakan domain ini:
Itu berarti SETIAP permintaan web yang masuk ke example.com sekarang akan menggunakan pembuat permintaan web kustom Anda, termasuk klien web standar. Pendekatan ini berarti Anda tidak perlu menyentuh semua kode Anda. Anda cukup memanggil awalan register sekali dan selesai dengan itu. Anda juga dapat mendaftar untuk awalan "http" untuk ikut serta dalam segala hal di mana pun.
sumber