13

説明できない興味深いケースがあり、IIS7での私の問題を理解するのに助けが必要です。

与えられた:

  • ASP.NET MVC4Webアプリケーション
  • {controller}/{action}に登録されているデフォルトルート

次のコントローラーを参照してください。

public class ServiceController : Controller
{
    public ActionResult Test()
    {
        return Content("Test");
    }

    [HttpPost]
    public ActionResult Test2()
    {
        return Content("Test2");
    }
}

さらに、Global.asaxには次のコードがあります。

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 404)
    {
        ExecuteIndexPage();
    }
}

protected void Application_Error(object sender, EventArgs e)
{
    var error = Server.GetLastError();
    ExceptionLogger.Log(error);

    ExecuteIndexPage();
}

したがって、サーバーエラーが発生すると、これがログに記録されます。この場合、および通常の404の場合、スタートページが返されます。これは(ほぼ)正常に機能します。それについては後で詳しく説明します。

このセットアップでは、IIS7(Windows Server 2008、実稼働環境)とIIS7.5(Win7 Pro、開発環境、およびWindows Server 2008 R2、実稼働環境)で非常に異なる動作が提供されます。

IIS(両方のバージョン)で次の構成が与えられた場合:

  • IISのWebは、統合モードのASP.NET4アプリケーションプールを使用して構成されます
  • <modules runAllManagedModulesForAllRequests ="true"/>はsystem.webServerセクションで設定されます

IIS 7.5では、動作は次のとおりです。

  • /へのGETリクエスト:インデックスページを返します
  • /へのPOSTリクエスト:インデックスページを返します
  • / Service / TestへのGETリクエスト:テストを返します
  • / Service / TestへのPOSTリクエスト:テストを返します
  • / Service / Test2へのGETリクエスト:Global.asaxを実行しますApplication_Error:HttpException:パブリックアクションメソッド「Test2」がコントローラー「MyTestProject.Controllers.ServiceController」で見つかりませんでした。
  • / Service / Test2へのPOSTリクエスト:Test2を返します
  • ルートがないものへのGETリクエスト:Global.asaxEnd_Requestを実行します。

IIS 7では、代わりに次のように動作します。

  • /へのGETリクエスト:インデックスページを返します
  • /へのPOSTリクエスト:IIS404ページ
  • / Service / TestへのGETリクエスト:テストを返します
  • / Service / TestへのPOSTリクエスト:IIS404ページ
  • / Service / Test2へのGETリクエスト:Global.asaxを実行しますApplication_Error:HttpException:パブリックアクションメソッド「Test2」がコントローラー「MyTestProject.Controllers.ServiceController」で見つかりませんでした。
  • / Service / Test2へのPOSTリクエスト:IIS404ページを返します
  • ルートがないものへのGETリクエスト:IIS404ページ

したがって、IIS7およびIIS7.5は、ルートがない場合を除いて、GET要求を使用するときにうまく機能します。ルートがない場合、IIS 7.5はステータスコード404でGlobal.asax終了要求を実行し、インデックスページを配信します。IIS 7は、Global.asax終了要求を実行しません。なんで?{* catchall}ルートを登録して、一致するルートが存在するようにすることで、この問題を回避できます(現在はそうしています)。

HTTP POSTを使おうとすると、IIS7の動作は予想よりもさらに小さくなります。

要求をPOSTすると、IIS 7はアプリケーションでコードを実行せず、IIS404ページを直接返します。

だから私の質問は:IIS7がMVC4アプリケーションでPOST要求を処理するのが非常に難しいのはなぜですか?また、POST要求も処理するようにするにはどうすればよいですか?

4

3 に答える 3

1

私たちはそれを理解しました-ついに。

デフォルト設定では、これがweb.configに挿入されます。

<system.webServer>
  <validation validateIntegratedModeConfiguration="false" />
  <modules runAllManagedModulesForAllRequests="true" />
  <handlers>
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
    <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
    <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
  </handlers>
</system.webServer>

問題は「*」です。パス。/test.aspxをカバーしますが、単に/testをカバーするわけではありません。

これを「*」に変更すると、すべてのリクエストがExtensionlessUrlHandlerによって処理されます。これには、もう提供されない静的ファイルへのリクエストも含まれます。

したがって、解決策は次のとおりです。ハンドラーエントリからPOST動詞を削除し、パスが「*」に設定されたExtensionlessUrlHandlerの新しいエントリをPOSTリクエストに対してのみ追加します。

    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit_post" path="*" verb="POST" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit_post" path="*" verb="POST" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
    <add name="ExtensionlessUrlHandler-Integrated-4.0_post" path="*" verb="POST" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

理想的には、不要なものを削除します(クラシックパイプラインと統合パイプラインのx86とx64)。

于 2014-01-13T12:14:32.903 に答える
0

これは、IIS 7にインストールされていない(または正しくインストールされていない)一部の機能に関係している可能性があります。これにより、拡張子のないURLが正しく機能しなくなります。

以下の項目を確認してください。

Windowsのコントロールパネルの[プログラムと機能]アプリケーションの[Windowsの機能をオンまたはオフにする]ダイアログボックスで、次の手順を実行します。

  1. [インターネットインフォメーションサービス]>[WorldWideWebサービス]>[一般的なHTTP機能]に移動します
  2. [HTTPエラーリダイレクト]オプションが選択されていることを確認してください。
  3. [静的コンテンツの圧縮]オプションが選択されていることを確認してください。いずれかのオプションを選択したら、[OK]をクリックして変更を保存します。

参照:http ://support.microsoft.com/kb/2023146

于 2013-05-10T21:24:26.510 に答える
0

おそらく、7と7.5のルーティングは、POSTフォームデータを受け入れることができる引数を持たないアクションにPOSTを渡すという点で異なります。

コードがヒットしない場合は、ルーティングが署名、引数、およびコードに渡す前にチェックする組み込みの制約に一致するものが見つからなかったことを示します。

次のステップは、モデルを渡さなくても、POSTに引数を追加してモデルを受け入れることです。その結果、モデルは明らかにnullになります。

于 2013-11-21T08:36:13.413 に答える