C#.NETのHttpClientにてCookieを使った通信を行いたい

アプリケーションでWeb上の操作を疑似的に行いたい時などで、クッキー情報を取り出して値を確認したい時などがあります。
そういった場合は、HttpClientHandlerのUseCookiesを有効にしてあげれば、あとは.Netがよきに計らってくれるらしい。
基本的にはtoriimiyukkiの日記さんに書かれていることですが、個人的な用途としてメモ書きです。


// クッキーを使いたいためUseCookies = trueに設定
using (var handler = new HttpClientHandler() { UseCookies = true })
using (var client = new HttpClient(handler) { BaseAddress = new Uri("https://yamahide.biz/") })
{
// ヘッダーの設定
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:35.0) Gecko/20100101 Firefox/35.0");
client.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
client.DefaultRequestHeaders.Add("Accept-Language", "ja,en-us;q=0.7,en;q=0.3");
client.DefaultRequestHeaders.Add("Referer", "https://yamahide.biz/login/");

// GETでリクエスト
var result = client.GetAsync("https://yamahide.biz/login/").Result;

// POSTの内容を作成
var content = new FormUrlEncodedContent(
new Dictionary
{
{ "UserID", "user01"},
{ "PASSWORD", "Passw0rd"},
});
// POSTでリクエスト
result = client.PostAsync("https://yamahide.biz/login/", content).Result;

// クッキーの値を抜き出す
CookieCollection cookies = handler.CookieContainer.GetCookies(new Uri("https://yamahide.biz/login/"));
string ASPNETSessionId = "";
foreach (System.Net.Cookie cook in cookies)
if (cook.Name == "ASP.NET_SessionId")
{
ASPNETSessionId = cook.Value;
}
}

Excel2010 の Macro にて改行コード(vbCrLf)を出力しても改行されない

Microsoft Excel 2010のマクロにて、改行コード(vbCrLf)をセルに出力しても改行されない場合があります。

Excel2010_Macro_vbCrLf_1
マクロ自体は次のような単純なもので確認できます。
Sub MacroNewLine()
Cells(1, 1) = "改行前" + vbCrLf + "改行後"
End Sub

このマクロをボタンに紐付けてクリックしても「改行前改行後」と表示されます。
ちなみに、数式バーでは正常に改行されていることが確認できます。

Excel2010_Macro_vbCrLf_2
少し確認していくと、違うセルだとうまく改行できるところもあったため「セルの書式設定」を確認すると、なんと“文字列”扱いとなっていました。この表示形式を“標準”に戻すことで、マクロからの改行が正しく表示されるようになりました。

Excel2010_Macro_vbCrLf_3
こんなことがあると、マクロでの文字列出力前にセルの書式設定を変更するといった対応が必要ですね。

Windows Server 2003 にて Microsoft Update が無限ループする場合の対処

大昔に構築してWindows UpdateをあまりしてこなかったWindows Server 2003環境で、久しぶりにアップデート作業を行おうとしたところ、URLの末尾に「&muopt=1」が追加され続けるだけで一向に終わらない現象に遭遇しました。

http://update.microsoft.com/microsoftupdate/v6/default.aspx?ln=ja&muopt=1&muopt=1&muopt=1&muopt=1
Windows_Server_2003_Microsoft_Update_1

調べてみるとWindows Update Agentを最新にすればよいとあったので「WindowsUpdateAgent30-x86.exe」をダウンロードしてインストールしようとするも、「Windows Update エージェントは既にインストール済みのため、インストールは必要ありません。」と表示されて実行できませんでした。

調べてみると、対処法はいろいろあるようですが、次のやり方が一番楽なようです。
Windows Update のコンポーネントをリセットする方法
http://support.microsoft.com/kb/971058

具体的には、下記をコマンドプロンプトで実行すればよいようです。
net stop wuauserv
net stop cryptsvc
Del "%ALLUSERSPROFILE%\Application Data\Microsoft\Network\Downloader\qmgr*.dat"
Ren %systemroot%\SoftwareDistribution SoftwareDistribution.bak
Ren %systemroot%\system32\catroot2 catroot2.bak
net start wuauserv
net start cryptsvc

Windows_Server_2003_Microsoft_Update_2
その後Internet ExplorerやリンクからWindows Update/Microsoft Updateを起動。するとWindows Updateのみになっているようなので、Windows Update Agentを導入後にMicrosoft Updateへ切り替え。再度、更新プログラムの検出を行えばMicrosoft Updateを無事行うことができました。

Windows_Server_2003_Microsoft_Update_3

ASP.NETでHTTP Error 500.21が表示された時の対応

ひょんなことからASPを自作したのですが、開発PCのMicrosoft Visual Web Developer 2010では正常に動作するのに、Windows Server 2012のIISで動作させた時だけ、初回アクセス時に以下のエラーが表示されるようになりました。

HTTP エラー 500.21 - Internal Server Error
ハンドラー "PageHandlerFactory-Integrated-4.0" のモジュール リストにあるモジュール "ManagedPipelineHandler" が正しくありません
ASP_NET_IIS_HTTP_500_21_Error_1

2回目にアクセスしたときは正常に動作するので、サーバのタスクスケジューラーで15分おきに該当URLにアクセスして、ユーザ影響がないようにしようかと考えておりました。
ネット上で検索すると、下記コマンドを実行して.NET Frameworkを修復しろと書いてあります。

■32bit OSの場合
%windir%\Microsoft.NET\Framework\v4.0.30319\SetupCache\Client\setup.exe /repair /x86 /x64 /ia64 /parameterfolder Client /q /norestart
%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe –i

■64bit OSの場合
%windir%\Microsoft.NET\Framework64\v4.0.30319\SetupCache\Client\setup.exe /repair /x86 /x64 /ia64 /parameterfolder Client /q /norestart
%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe –i

ただし、上記コマンドはWindows Server 2008 R2までで、Windows 2012以降はサポートされていないもののようです。

困り果てて色々設定を変えていたところ、アプリケーションプールの「マネージパイプラインモード」を「統合」から「クラシック」に変更すると、初回アクセスもスムーズに動作するようになりました。
ASP_NET_IIS_HTTP_500_21_Error_2

なんてことない、開発者がへぼいせいで残念な結果でした。

Windows版のMySQLバックアップとリストアについて

まずはバックアップから。mysqldumpコマンドで取得できます。
環境パスにMySQLのディレクトリを追加していない場合は「cd C:\mysql\bin」などbinフォルダに移動してください。

mysqldump -u ユーザ名 -p パスワード -h ホスト名 [データベース名] [テーブル名] [オプション] > バックアップ先

データベース名が「wordpress」というものを取得する場合は次のような文字列を実行します。
mysqldump -u root -p --default-character-set=binary --compatible=ansi wordpress > "C:\backup.sql"

リストアはmysqlコマンドで行います。

mysql -uユーザ名 -pパスワード [データベース名] [テーブル名] < バックアップファイル名

データベース名が「wordpress」というものを復元する場合は、次の文字列を実行します。
mysql -u root -p wordpress < "C:\backup.sql"