MetroスタイルアプリでUser-Agentを指定しつつクッキーも使ってHTTP通信したい

※この記事はWindows8RPについて書いていますがわかりません。当然今後のことも本当のところも分かりません。

User-Agent指定してダウンロードするコード

using System.Net.Http;
using System.Threading.Tasks;

static class Connection
{
    public static async Task<string> Get(string url)
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Add("User-Agent", "Hogezilla");
            return await client.GetStringAsync(url);
        }
    }
}

 

とっても簡単です。でもこれクッキー使えないんですよね。

そこで、クッキー使えそうなコード。

using System.IO;
using System.Net;
using System.Text;
using System.Threading.Tasks;

static class Connection
{
	static CookieContainer cookies = new CookieContainer();
	static Encoding enc = Encoding.GetEncoding("Shift-Jis");
	public static async Task<string> Get(string url)
	{
		HttpWebRequest req = HttpWebRequest.CreateHttp(url);
		req.CookieContainer = cookies;
		req.UserAgent = "Hogezilla"; //←そんなプロパティねーよって怒られる
		req.Headers.Add("User-Agent", "Hogezilla"); //←そんなメソッドねーよって怒られる

		using (WebResponse res = await req.GetResponseAsync())
		using(Stream resStream = res.GetResponseStream())
		{
			byte[] resBytes = new byte[res.ContentLength];
			await resStream.ReadAsync(resBytes, 0, resBytes.Length);
			return enc.GetString(resBytes, 0, resBytes.Length);
		}
	}
}

 

確かにここを見るとUser-AgentヘッダーはHeadersプロパティから変えられないからUserAgentプロパティから変更しろって書いてるんだけどなー。

WinRTの時だけ違う方法があるのだろうか。かれこれ数日間悩んでるんで、上手く書けたらアウトプットしますよ。

 

ってことで数日悩んでやっと出来ました。HttpClientHandlerクラスが鍵でしたね。

using System.Net;
using System.Net.Http;
using System.Threading.Tasks;

static class Connection
{
	static CookieContainer cookies = new CookieContainer();
	public static async Task<string> Get2(string url)
	{
		using (var handler = new HttpClientHandler())
		using (var client = new HttpClient(handler))
		{
			handler.CookieContainer = cookies;
			client.DefaultRequestHeaders.Add("User-Agent", "Hogezilla");
			return await client.GetStringAsync(url);
		}
	}
}