4

CSS と JavaScript がそれぞれ/Content//Scripts/ディレクトリにバンドルされているサイトがあります。これらはどちらも、静的リソースに使用される別のドメイン内の仮想ディレクトリのマップ ターゲットでもあります (そのため、Cookie は提供されません)。

問題は、 が false に設定されている (バンドルと縮小が有効になっている) 実稼働環境でcompilation -> debugは、相対 URL は正常に機能し、バンドル システムから提供されるようになりますが、静的ドメイン URL は (同じ場所を指す仮想ディレクトリを使用して)場所)お譲り致しHTTP 404 errorsます。

この仮想ディレクトリのコンテンツに対してバンドルが機能するように IIS を構成する方法はありますか? バンドルを認識できるように、静的ドメイン用に別のダミー MVC プロジェクトを作成する必要があるというビジョンがありますが、より良い解決策があるかどうかを確認したいと考えています。

IIS からの現在の処理順序は次のようになります。

  1. (バンドルされた) リソースの着信要求を受信します。[static domain]/Content/all.css
  2. 利用可能な場合はバンドルなど、任意の HTTP ハンドラを実行します (この静的ドメインの場合はありません)。
  3. 仮想ディレクトリをたどり、利用可能な場合はリソースを提供します。つまり、を検索します([main domain]/Content/all.css)

このファイルは実際にはファイル システムに存在しないため、anHTTP 404が発生します。理想的には、ステップ2はステップ3の後に実行する必要があります。

どうもありがとう。

4

2 に答える 2

2

私は少し実験をして、なんとかそれを解決することができました。ファイルが共有されるため、静的サイトのルートがメインWebサイトの同じルートを指すように機能しませんweb.config。静的サイトに加えられた変更(つまり、セッション状態の無効化)は、メインWebサイトにも適用されます。

結局、機能するのは次のとおりです。

  • 静的ドメインがファイルシステム上の別のルートフォルダを指すようにします。
  • 静的サイト(/Content/および/Scripts/)の仮想ディレクトリが、メインサイトの対応する場所を指しているようにします。
  • キャッシュバスティングにはHeliconのURLリライターを.htaccess使用しているため、メインサイトで使用されているのと同じルールで必要最低限​​のファイルを作成します。それを静的サイトのルートに置きます。
  • global.asaxメインのWebサイトから静的サイトのルートにファイルをコピーします。これはショートカットにはなりません。
  • /bin/フォルダの内容をメインのWebサイトから静的サイトに コピーします。
    • メインWebサイトのフォルダーを指すIISの仮想ディレクトリは機能し/bin/ません。
    • メインWebサイトのフォルダへのショートカットをファイルシステムに作成すること/bin/もできません。
  • IISで、静的サイトが独自のアプリケーションプールを使用していること、および.NET4.0の統合パイプラインモード用に構成されていることを確認します。これは、MVC4バンドルが機能するようにするためです。
  • 追加されたベアボーンを作成しweb.configますUrlRoutingModule

これはweb.config静的サイト用です:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.web>
        <customErrors mode="Off">
        </customErrors>
        <sessionState mode="Off" />
        <pages enableSessionState="false" enableViewState="false" enableViewStateMac="false" renderAllHiddenFieldsAtTopOfForm="false" />
    </system.web>
    <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
        <modules runAllManagedModulesForAllRequests="true">
            <remove name="ScriptModule" />
            <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        </modules>
        <urlCompression doStaticCompression="true" doDynamicCompression="true" />
        <security>
            <requestFiltering allowDoubleEscaping="True" />
        </security>
        <tracing>
            <traceFailedRequests>
                <add path="*">
                    <traceAreas>
                        <add provider="ASPNET" areas="Infrastructure,Module,Page,AppServices" verbosity="Verbose" />
                    </traceAreas>
                    <failureDefinitions timeTaken="00:00:00" statusCodes="200" />
                </add>
            </traceFailedRequests>
        </tracing>
        <!-- Cache static content for a month, only enable on UAT or Live -->
        <staticContent>
            <clientCache cacheControlMode="UseMaxAge" cacheControlMaxAge="30.00:00:00"/>
        </staticContent>
    </system.webServer>
</configuration>

主なアイデアは、仮想ディレクトリが検討される前にバンドルがIISによって評価されるため、バンドルではASP.NET MVC4を有効にして静的サイトで実行する必要があるということです(これを元に戻す方法はないようです)。

于 2013-02-04T23:44:28.990 に答える