ASP.NET MVC3 のローカル開発環境でアクションから 完全修飾URL を取得しようとするとポート番号がずれる

参考: http://forums.asp.net/p/1731128/4642271.aspx/1

port 81 に接続するような Azure Emulator を利用している時の話。環境は Azure SDK 1.6(November 2011)です。

Url.Action(“Notify”,”Home”,new { ぱらめーた }, “http”) というように末尾に http または https を渡し、以下のような文字列が生成されるのを期待した。

http://localhost:81/Home/Notify/ぱらめーた

しかし実際に実行すると以下のように port 82 になってしまう。

http://localhost:82/Home/Notify/ぱらめーた

Emulator といえど、内部的にロードバランサが作成され、実際に動作しているWebプロセスは port 82 対して動作しているのが原因であろう。とはいえ、これはロードバランサの向こう側の話であり、使う側からすれば使えないポート番号である。

解決策を探したが、コレ! という解決策は見つからず、現時点では DEBUG ビルドにおいてはポート番号を書き換えるコードを挟み込むことにした。

// コロン-数字-スラッシュ の結合を正規表現で検出する static readonly Regex reポート番号inUrl = new Regex(@"\:[0-9]+/"); static readonly Regex reポート番号 = new Regex(@"\:[0-9]+"); [Conditional("DEBUG")] private void 開発環境ポート番号調整() { string ブラウザからの接続先ポート番号 = "/"; var host = Request.Headers["Host"]; var m = reポート番号.Match(host); if (m.Captures.Count > 0) ブラウザからの接続先ポート番号 = m.Value + "/"; var MVC3から取得したURL = Url.Action("Notify", "Home", new { なにか }, Request.Url.Scheme); var 完全修飾URL = reポート番号inUrl.Replace(MVC3から取得したURL, ブラウザからの接続先ポート番号 + "/"); ... 完全修飾URLを外部に通知する何か

正規表現による置換のため、、別の箇所にマッチする可能性はゼロではない。「引数として利用される文字列にスラッシュを含まない」環境であれば大丈夫という程度のコードである。ConditionalAttribute を利用してDEBUGビルド時のみ有効になるようにした。#ifdef  よりもすっきりするため、[Conditional(“DEBUG”)] は必要とあれば好んで利用している。

「外部との連携」での問題であるが、外部サイトのエミュレーション環境自体も 開発マシンでホストしているという状況でデバッグする時に利用することになる。

MVCなんだから、Request に対してモック適用しながら単体テストを書く開発スタイルが本筋であろうが、人によっては必要ということで。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。