説明できない興味深いケースがあり、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要求も処理するようにするにはどうすればよいですか?