36

一部のコードを単体テストしようとしていますが、これを置き換える必要があります。

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

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

基本的に、HttpWebRequest を使用せずにリクエストに Cookie を取得するにはどうすればよいですか?

4

4 に答える 4

39

あなたのコメントに基づいて、あなたは拡張メソッドを書くことを検討するかもしれません:

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"));
于 2012-06-22T21:37:55.457 に答える
7

WebRequestは、CookieContainerプロパティを持たない抽象クラスです。さらに、Headersコレクション(実装されていない例外)を使用できないため、webRequest.Headers.Add( "Cookie"、 "...")などの試行は失敗します。

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

HttpWebRequestに固執し、Headersコレクションを使用して好きなだけCookieを追加/編集してください!

于 2012-06-22T21:39:17.190 に答える
7

次のようなものを試してください:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/default.html");
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(new Cookie("ConstoCookie", "Chocolate Flavour"));
于 2012-06-22T21:28:25.977 に答える
1

dlev の答えはうまくいきましたが、ソリューションの実装に問題があったため (「パラメーター '{0}' を空の文字列にすることはできません」)、他の誰かが同様の問題を抱えている場合に備えて、完全なコードを記述することにしました。

私の目標は、html を文字列として取得することでしたが、Web 要求に Cookie を追加する必要がありました。これは、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 の回答のコードを使用しています。

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

これは、完全なコードを使用する方法です。

var cookieNameValues = new Dictionary<string, string>();
cookieNameValues.Add("varName", "varValue");
var htmlResult = DownloadString(url, Encoding.UTF8, cookieNameValues);
于 2016-08-19T09:46:58.137 に答える