私はいくつかのコードを単体テストしようとしていますが、これを置き換える必要があります:
HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create( uri );
httpWebRequest.CookieContainer = new CookieContainer();
と
WebRequest webRequest = WebRequest.Create( uri );
webRequest.CookieContainer = new CookieContainer();
基本的に、HttpWebRequestを使用せずにリクエストにCookieを取得するにはどうすればよいですか?
コメントに基づいて、 拡張メソッド :
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"));
WebRequestは、CookieContainerプロパティを持たない抽象クラスです。さらに、Headersコレクション(実装されていない例外)を使用できないため、webRequest.Headers.Add( "Cookie"、 "...")などの試行は失敗します。
申し訳ありませんが、WebRequestでCookieを使用する機会はありません。
HttpWebRequestに固執し、Headersコレクションを使用して好きなだけのCookieを追加/編集します!
次のようなもので試してください:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.contoso.com/default.html");
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add(new Cookie("ConstoCookie", "Chocolate Flavour"));
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);