web-dev-qa-db-ja.com

Global.aspxのApplication_Startで完全なホスト名とポート番号を取得する方法は?

私は試した

Uri uri = HttpContext.Current.Request.Url;
String Host = uri.Scheme + Uri.SchemeDelimiter + uri.Host + ":" + uri.Port;

そして、それは私のローカルマシンでうまく機能しましたが、IIS7に公開されているとき、例外があります

System.Web.HttpException: Request is not available in this context

誰もこれを達成する方法を知っていますか?

49
Leo

Webアプリケーションが起動すると、HTTPリクエストは処理されません。

リクエストコンテキストが利用可能なApplication_BeginRequest(Object Sender、EventArgs e)メソッドを定義することもできます。

編集: Michael ShimminsがリンクしたMike Volodarskyのブログに触発されたコードサンプルを次に示します。

    void Application_BeginRequest(Object source, EventArgs e)
    {
        HttpApplication app = (HttpApplication)source;
        var Host = FirstRequestInitialisation.Initialise(app.Context);
    }

    static class FirstRequestInitialisation
    {
        private static string Host = null;
        private static Object s_lock = new Object();

        // Initialise only on the first request
        public static string Initialise(HttpContext context)
        {
            if (string.IsNullOrEmpty(Host))
            {
                lock (s_lock)
                {
                    if (string.IsNullOrEmpty(Host))
                    {
                        var uri = context.Request.Url;
                        Host = uri.GetLeftPart(UriPartial.Authority);
                    }
                }
            }

            return Host;
        }
    }
60
cspolton

受け入れられた答えは良いですが、ほとんどの場合(最初のリクエストがHTTPリクエストの場合)、Session_Startイベント。ユーザーごとに20分ごとに呼び出されます(セッションの有効期間は不明です)。 Application_BeginRequestは、リクエストごとに発生します。

public void Session_Start(Object source, EventArgs e)
{
   //Request / Request.Url is available here :)
}
9
VladL

これに答えるだけで、誰かがこのトピックを実際に検索することに決めたら...

これは、どのモードでもアプリケーションの起動時に機能します...

typeof(HttpContext).GetField("_request", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(HttpContext.Current)
2
Brandon Seydel