7

このプロパティHttpContext.Current.Request.ApplicationPathは、IISまたはWebDev.WebServerの仮想ディレクトリを表します。

 HttpContext.Current.Request.ApplicationPath evaluates to "/virtualdirectory"

VirtualPathUtilityこれは、パスルートを相対的なものにするためにと組み合わせて使用​​できます。

 VirtualPathUtility.ToAbsolute("~/images/cat.jpg",
                               HttpContext.Current.Request.ApplicationPath)

 // (this evaluates to "/virtualdirectory/images/cat.jpg")

IIS6およびWebDev.WebServerでは、Requestオブジェクトはで使用できますがglobal.asax.cs、IIS7は「現在のコンテキストでは使用できない」と文句を言います。したがって、上記のコードの2行目は機能しますが、IIS7では機能しません。

問題は、内の仮想directroy名にアクセスする必要があることですglobal.asax.cs。動的に作成されたCSSで使用されるいくつかのパスを構築するために必要です。この値にアクセスする別の方法はありますか?

編集:これは、HttpContext.Current.RequestApplication_Startの下でglobal.asax.csを呼び出すためにIIS7で発生するエラーです。

 HttpException (0x80004005): Request is not available in this context]
    System.Web.HttpContext.get_Request() +8789264
4

5 に答える 5

14

ついに簡単な答えが見つかりました!

 HttpRuntime.AppDomainAppVirtualPath

Application_Start中にすぐに利用可能

これはプレフィックス/myapplicationを含む形式です。/

于 2010-01-03T05:02:08.140 に答える
0

うーん...IIS7の変更に気づいていませんでした。ページを取得するまでこの操作を延期する方が簡単ではないでしょうか。たとえば、「1回だけ」何かを入れてみることができますApplication_BeginRequestSession_Start

または(完全にテストされていない)自己購読解除フックの場合:

    public override void Init() {
        base.Init();
        EventHandler handler = null;
        handler = delegate {
            // do stuff, once only
            this.BeginRequest -= handler;
        };
        this.BeginRequest += handler;
    }

秘訣はそれを1回だけ行うことです(複数のリクエストが同時に到着した場合)。おそらく静的コンストラクター?たとえば、これは1回だけ発生し、コンテキストで使用可能なページがある場合にのみ発生すると思います。

    static class DelayedLoader {
        static DelayedLoader() {
            string s = VirtualPathUtility.ToAbsolute("~/images/cat.jpg",
                           HttpContext.Current.Request.ApplicationPath);
        }
        [MethodImpl(MethodImplOptions.NoInlining)]
        public static void Init() { }
    }
    public override void Init() {
        base.Init();
        EventHandler handler = null;
        handler = delegate {
            DelayedLoader.Init();
            this.BeginRequest -= handler;
        };
        this.BeginRequest += handler;
    }
于 2009-04-29T08:29:36.440 に答える
0

ResolveUrl( "〜/ images / cat.jpg")を使用してパスを作成できますか?

編集: ResolveUrlは、Pageクラスだけでなく、Controlのメソッドであるため、代わりにこの方法で実行できます(少し醜いかもしれません)。

System.Web.UI.Control c = new Control();
String s = c.ResolveUrl(@"~/images/cat.jpg");
于 2009-04-28T20:48:11.417 に答える
0

これは私が思いついた最高のものです:Application_BeginRequest(マーク経由)

私はasaxをめったに使用しないので、一時的にさまざまなイベントが発生することを忘れていました。これまで、でCSSスプライトを作成していましたApplication_Start。それをBeginRequestに移動することは、私が思いついた最高のものでした。

リクエストごとに1つのブールチェックは無視できますが、別の方法があると便利です。

  protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }

    protected void Application_BeginRequest()
    {
        if (!_initialized)
        {
            lock (thisLock)
            {
                _initialized = true;
                GenerateCSSSprites();  
            }
        }
    }
于 2009-04-29T09:02:15.833 に答える
0

IIS7に切り替えたときにもこの問題が発生しましたが、リクエストの必要性をリファクタリングすることができました。これは、この男が提案し、できない場合の回避策を提供するものです。

http://mvolo.com/blogs/serverside/archive/2007/11/10/Integrated-mode-Request-is-not-available-in-this-context-in-Application_5F00_Start.aspx

于 2009-04-29T09:02:46.237 に答える