2

最近、私はこれを尋ねました:

My Web アプリケーションのベース URL を取得する

私はVS開発サーバーを使用しているため、これはデバッグである程度機能しました。

次に、インストールを作成すると、インストールは IIS 7 を指します。

私が持っていた:

    void Application_Start(object sender, EventArgs e)
    {
        _baseUrl = HttpContext.Current.Request.Url.ToString();
        ....
    }

しかし、これは次のエラーをスローしました:

このコンテキストではリクエストを利用できません

次に、いくつかの読み取りを行いましたが、これが発生する理由は次のとおりです。

http://mvolo.com/iis7-integrated-mode-request-is-not-available-in-this-context-exception-in-applicationstart

次に、コードを Application_Start から Application_BeginRequest に移動しました。Application_BeginRequest が数回実行されていることがわかったため、上記の手法を使用しました。

しかし、問題は、Application_Start で使用するために IIS 7 のベース URL が必要であるため、設定しようとしたグローバル文字列があることです。

FirstRequestInitialization.Initialize(context);

しかし、これを試みても驚くことではありません:

Application["BaseUrl"] = HttpContext.Current.Request.Url.ToString();

次のエラーが表示されます: 「Microsoft.Web.Administration.Application」は「タイプ」ですが、「変数」のように使用されます

必要なのは IIS 7 のベース URL だけです。

IIS 6 をサポートできないため、ディレクトリ エントリを使用できません。

これどうやってするの?回避策はありますか?VS から AppCmd を実行できますか?

どんな助けでも大歓迎です。ありがとう!

4

1 に答える 1

4

簡単な答え: ウェブサイトには単一の正規ベース URI がないため、取得できません。ウェブサイト (またはウェブ アプリケーション) は、任意のバインディング、任意のドメイン名、および任意のリソースの要求に応答するように構成できます。パス - ホスト Web サーバー (IIS) で Web サイトを再構成することができ、アプリケーションはこれをまったく認識しません。

本当に「ベース URL」を保存したい場合 (そのようなものは実際には存在しませんが)、次のApplication_BeginRequestように内部から実行できます。

private static readonly Object _arbitraryUrlLock = new Object();
private static volatile String _arbitraryUrl;

public void Application_BeginRequest() {
    if( _arbitraryUrl == null ) 
        lock( _arbitraryUrlLock )
            if( _arbitraryUrl == null ) 
                _arbitraryUrl = HttpContext.Current.Request.Url.ToString();
}
于 2013-04-11T07:36:46.743 に答える