web-dev-qa-db-ja.com

IIS 7.0 / Windows Server 2008上のASP.NET MVC 3アプリで404.0エラーが発生する

ASP.NET MVC 3アプリケーションをWindows 2008 x64サーバーに展開しようとしています(IIS 7.0を実行していることは明らかです)、IISは表示したくないコンテンツを適切に提供します。すべての要求は404.0エラーになります。これは、要求がどのハンドラとも一致せず、IISがStaticFileハンドラを使用して要求を提供しようとしているためです。問題.NET 2.0ランタイム用に構成されたアプリプールでMVC 2アプリケーションを正常に実行しているため、.NET 4.0に関連しているようです。

これと同じアプリケーションをWindows 7とWindows Server 2008 R2の両方のIIS 7.5サーバーに展開することには問題がありませんでした。

デプロイ前は、2008サーバーに.NET 4.0またはASP.NET MVC 3がインストールされていなかったため、アプリケーションをデプロイする前に以下の手順を実行しました。

  1. インストールされた.NET 4.0
  2. Aspnet_regiis.exeを実行しました(Framework64/v4.0.30319フォルダーから)
  3. Webプラットフォームインストーラーを使用してASP.NET MVC 3をインストール
  4. 適用されたMSアップデート KB980368 特定のIIS 7.0またはIIS 7.5ハンドラーを有効にして、URLがピリオドで終わらないリクエストを処理するため

アプリケーションの静的リソース(JavaScriptファイル、画像など)へのリクエストは問題なく通過しますが、MVCアクションへのリクエストは404.0エラーで失敗します。 IISはこれらのリクエストを処理するためにStaticFileハンドラーを使用していますが、これは明らかに正しくありません。ASP.NET4.0ハンドラー(つまり、ExtensionlessUrl-ISAPI-4.0 *ハンドラー)は適切に定義されています)私が知ることができるので、なぜ/どのようにしてリクエストがこれらのハンドラのいずれかで処理されず、StaticFileハンドラに落ちるのかわかりません。

また、次の MSナレッジベースの記事 には、404エラーが発生しているサーバーでHTTPリダイレクトと静的コンテンツ圧縮が有効化/インストールされていることを確認する必要があると記載されています。チェックしたところ、サーバーでは両方の機能が既に有効になっています。私は機能を削除して再インストールしようとしても役に立たなかった。

この時点で、なぜこれが適切に機能しないのかについての考えは完全になくなっています。 2つの異なるIIS 7.0サーバーで問題を再現できました。何が不足していますか?

32
Justin Holzer

問題は、コードが完全にIIS 7.5。 IISで、今度はglobal.asax.csファイルを変更して、アプリケーションが読み込まれる方法とタイミングに関係なく、アプリケーションが適切に初期化されるようにしました。

2
Justin Holzer

実際に、この環境でこの問題を修正する必要があることを思い出させてくれました。あなたの状況が私のものと同じなら、それは簡単な修正です。

以下をウェブ設定に追加するだけです:

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />

編集:目前の問題についてさらに説明するため。私の場合、カスタムルートマッピングIISを追加したときに、リクエストがフォルダー/静的ファイルのリクエストとして表示されていたため、ASP.NETワーカープロセスがスキップされていました。これは、開発環境では通常、異なる動作をします。これは、.netプロセスを通じてすべてのリクエストも渡す開発用Webサーバーの下で実行されるためです。

このWeb Configエントリは、IISが静的ファイルまたはフォルダーであると判断した場合でも、すべてのWeb要求で実行する必要があるモジュールがあることをIISに通知します。

36
Michael Merrell

IIS 7.0統合モードで実行していることを確認してください。IIS 7.0クラシックモードで実行する必要がある場合は、いくつかのアクションを実行する必要があります。ルートを機能させるには、以下のブログ投稿を参照してください。

http://www.tugberkugurlu.com/archive/running-asp-net-mvc-under-iis-6-0-and-iis-7-0-classic-mode---solution-to-ルーティング問題

http://www.tugberkugurlu.com/archive/deployment-of-asp-net-mvc-3-rc-2-application-on-a-shared-hosting-environment-without-begging-the- hosting-company

3
tugberk

すべてを試した後の私の解決策:

悪い配置、古いPrecompiledApp.configが私の配置場所にぶら下がっていて、すべてが機能していませんでした。

うまくいった私の最終設定:

  • IIS 7.5、Win2k8r2 x64、
  • 統合モードのアプリケーションプール
  • web.configに変更はありません-これはルーティングのための特別なハンドラーがないことを意味します。これは、他の多くの投稿が参照しているセクションのスナップショットです。私はFluorineFXを使用しているので、そのハンドラーを追加しましたが、他のハンドラーは必要ありませんでした。

    <system.web>
      <compilation debug="true" targetFramework="4.0" />
      <authentication mode="None"/>
    
      <pages validateRequest="false" controlRenderingCompatibilityVersion="3.5" clientIDMode="AutoID"/>
      <httpRuntime requestPathInvalidCharacters=""/>
    
      <httpModules>
        <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx"/>
      </httpModules>
    </system.web>
      <system.webServer>
        <!-- Modules for IIS 7.0 Integrated mode -->
        <modules>
          <add name="FluorineGateway" type="FluorineFx.FluorineGateway, FluorineFx" />
        </modules>
    
        <!-- Disable detection of IIS 6.0 / Classic mode ASP.NET configuration -->
        <validation validateIntegratedModeConfiguration="false" />
      </system.webServer>
    
  • Global.ashx:(メモの唯一のメソッド)

    void Application_Start(object sender, EventArgs e) {
        // Register routes...
        System.Web.Routing.Route echoRoute = new System.Web.Routing.Route(
              "{*message}",
            //the default value for the message
              new System.Web.Routing.RouteValueDictionary() { { "message", "" } },
            //any regular expression restrictions (i.e. @"[^\d].{4,}" means "does not start with number, at least 4 chars
              new System.Web.Routing.RouteValueDictionary() { { "message", @"[^\d].{4,}" } },
              new TestRoute.Handlers.PassthroughRouteHandler()
           );
    
        System.Web.Routing.RouteTable.Routes.Add(echoRoute);
    }
    
  • PassthroughRouteHandler.cs- http://andrew.arace.info/stackoverflow から http://andrew.arace.info/#stackoverflow への自動変換を実現しました。その後、default.aspxで処理されます。

    public class PassthroughRouteHandler : IRouteHandler {
    
        public IHttpHandler GetHttpHandler(RequestContext requestContext) {
            HttpContext.Current.Items["IncomingMessage"] = requestContext.RouteData.Values["message"];
            requestContext.HttpContext.Response.Redirect("#" + HttpContext.Current.Items["IncomingMessage"], true);
            return null;
        }
    }
    
2
Andrew Arace

同じ問題がありました。鉱山は、アプリの起動時に失敗したアセンブリでした。 Fusion Log Viewerを有効にして、失敗しているアセンブリを確認し、それを把握しました。 MVCルーティングの問題のように思えたので、これを発見したことはありませんでしたが、この問題で他の人が時間を無駄にした場合に備えて、これを投稿するつもりでした。

0
John Hamm

IIS 7.5以降でWebアプリケーションを実行している場合は、IISの役割サービスが適切に有効になっていることを確認してください。対象となる役割サービスは次のとおりです。 ASP.NET、基本認証、HTTPリダイレクション、ISAPIフィルターなど。

[プログラムの追加と削除]から役割サービスに移動できます-Windowsの機能をオンまたはオフにします。お役に立てれば。

よろしく、キランバンダ

0
Kiran Banda