2012-06-22 28 views
20

Bazı kod birimi testi çalışıyorum ve bu yerine gerekir:WebRequest'e çerezler nasıl eklenir?

HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create(uri); 
    httpWebRequest.CookieContainer = new CookieContainer(); 

Temelde

WebRequest webRequest = WebRequest.Create(uri); 
    webRequest.CookieContainer = new CookieContainer(); 

ile, nasıl alabilirim bir HttpWebRequest kullanmadan istek cookies? Böyle bir şey

+0

:

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; } 

Bu tam kodu kullanabilirsiniz nasıl bu çerezleri kullanarak dize indirir fonksiyondur Bu zor olurdu, çünkü çerezler bir HTTP kavramdır. Bu değişikliği yapmak için bir gerekçe var mı? – dlev

+0

@dlev - WebRequest, uri'ye dayalı bir HttpWebRequest oluşturacaktır. Bu yüzden, kendi WebRequest nesnesini alay etmek ve/veya bir WebRequest döndüren kendi uri'mı kaydettirmek istiyorsam, bu yöntemi yalnızca bir HttpWebRequest nesnesiyle çalışmak için kısıtlamak istemiyorum. –

+1

"webRequest" in çalışma zamanı türünün "HttpWebRequest" olacağını anlıyorum. Ancak "CookieContainer" öğesine erişilmesi, derleme zamanı türünün "HttpWebRequest" olmasını gerektirir. Ayrıca, kendinizi HTTP'ye kısıtlamadığınızdan da bahsetmişsinizdir, ancak bu durumda, bir HTTP yapısı olduğu için çerezlerin çok fazla bir anlamı yoktur (ilk etapta WebRequest'de bulunmalarının sebebi de budur.) – dlev

cevap

22

, Yazmakta dikkate alabileceğiniz bir extension method:

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; 
} 

Sonra olabilir kod gibi:

WebRequest webRequest = WebRequest.Create(uri); 
webRequest.TryAddCookie(new Cookie("someName","someValue")); 
+1

Bu kod şunu döndürür: "'{0}' parametresi boş bir dize olamaz." on line httpRequest.CookieContainer.Add (çerez) ;. Herhangi bir fikir? –

+2

@drdigit Bunun nedeni, bir etki alanı içeren bir çerez oluşturmadınız. Ayrıca, hata dizesinin BCL'deki bir hata olduğundan eminim (ki, maalesef, 4.5'de devam ediyor gibi görünüyor) – dlev

+0

Detaylı yanıt için çok teşekkürler. –

3

Dene: Yorumlarınıza dayanarak

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/default.html"); 
request.CookieContainer.Add(new Cookie("ConstoCookie", "Chocolate Flavour")); 
+0

için yararlı oldu sahiptir.Yeni WebRequest oluşturma ve bu istek için bir çerez ayarlama ile ilgilidir (ve soruya bakarak, ünite testinden gelen talebi yerine getirerek). –

+2

, bu bir 'nesne referansı bir ... 'olarak ayarlanmadı hatası verir. İlk önce 'request.CookieContainer = yeni CookieContainer(); – shashwat

6

WebRequest, CookieContainer özelliği olmayan soyut bir sınıftır. Ayrıca, WebRequest.Headers.Add ("Cookie", "...") gibi herhangi bir girişimin başarısız olması için, Üstbilgiler koleksiyonunu (uygulanan istisna değil) kullanamazsınız.

Üzgünüz, ancak WebRequest ile çerezleri kullanma şansınız yok.

HttpWebRequest üzerinde sopa ve Başlıklarını koleksiyonu kullanarak istediğiniz kadar çok çerez ekleyin/düzenleyin!

+0

Bu yüzden korktum. –

+0

Ben yapmadım :) Senin "eğer daha sonra addcookies" gereksinimi HttpWebRequest.Headers.Add ("Cookie", "...") tarafından karşılanabilir. –

0

dlev'in yanıtı çalışmayı sonlandırdı, ancak çözümü uygularken sorunlar yaşadım ("{0} 'parametresi boş bir dize olamaz."), Bu nedenle başkalarının benzer sorunları olması durumunda tam kodu yazmaya karar verdim .

Amacım html'yi bir dize olarak almaktı, ancak çerezleri web isteğine eklemem gerekiyordu.

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; 
    } 
} 

Biz dlev cevabı kodunu kullanıyor::

var cookieNameValues = new Dictionary<string, string>(); 
cookieNameValues.Add("varName", "varValue"); 
var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues); 
İlgili konular