2012-06-22 14 views
20

私はユニットテストにいくつかのコードをしようとしています、と私は、この交換する必要があります。基本的にはWebRequestにクッキーを追加するには?

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

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

を、どのように私は、HttpWebRequestのを使用せずに、要求にクッキーを得るのですか?

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

これは、あなたが完全なコードを使用する方法ですこれは、クッキーを使用して文字列をダウンロードする機能ですクッキーはHTTPのコンセプトなので、難しいでしょう。この変更を行う必要がある理由はありますか? – dlev

+0

@dlev - WebRequestはuriに基づいてHttpWebRequestを作成します。したがって、自分のWebRequestオブジェクトをモックアップしたり、WebRequestを返す自分のuriを登録したりする場合は、メソッドをHttpWebRequestオブジェクトでしか動作させないようにする必要はありません。 –

+1

'webRequest'の実行時の型は' HttpWebRequest'と理解しています。しかし、 'CookieContainer'にアクセスするには、コンパイル時の型が' HttpWebRequest'である必要があります。また、あなたはHTTPに自分自身を束縛していないと言いますが、その場合、CookieはHTTP構造であるため意味がありません(最初は 'WebRequest'が存在しない理由です)。 – dlev

答えて

22

、あなたは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; 
} 

次に、あなたのようなコードを持つことができます。

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

このコードは、 "パラメータ '{0}'を空の文字列にすることはできません。オンラインhttpRequest.CookieContainer.Add(cookie);何か案が? –

+2

@drdigitこれは、ドメインを含むCookieを作成しなかったためです。また、私はエラー文字列がBCLのバグだと確信しています(残念ながら、4.5に残っているようです) – dlev

+0

詳細な返信をありがとうございます。 –

3

はこのようなものを試してください:あなたのコメントに基づいて

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

質問がレスポンスにクッキーを設定することに関するものではありません私のために役立ったです。それは新しいWebRequestを作成し、このリクエストのクッキーを設定することです(質問のタグを見て、単体テストから要求を実行することです)。 –

+2

これは 'オブジェクト参照が設定されていない... 'というエラーをスローします。まず、 'request.CookieContainer = new CookieContainer();'が必要な場合があります。 – shashwat

6

をWebRequestは、CookieContainerプロパティを持たない抽象クラスです。さらに、ヘッダーコレクション(実装されていない例外)を使用することはできませんので、webRequest.Headers.Add( "Cookie"、 "...")のような試みは失敗します。

申し訳ありませんが、WebRequestでCookieを使用する機会はありません。

HttpWebRequestに固執し、ヘッダーコレクションを使用して好きな数のクッキーを追加/編集してください!

+0

それは私が恐れていたものです。 –

+0

私はそれをしなかった:)あなたの "if then addcookies"要件は、HttpWebRequest.Headers.Add( "Cookie"、 "...")でカバーすることができます。 –

0

dlevの回答がうまくいったのですが、ソリューションの実装に問題がありました(「パラメータ '{0}'は空の文字列ではありません」)。 。

私の目標はhtmlを文字列として取得することでしたが、Webリクエストに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; 
    } 
} 

我々はDLEVの答えからコードを使用している:

var cookieNameValues = new Dictionary<string, string>(); 
cookieNameValues.Add("varName", "varValue"); 
var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues); 
関連する問題