現在IIS7でクラシックモードで実行されているASP.NETMVCアプリケーション(バージョン1)を維持しています。代わりに、統合パイプラインモードでアプリの実行を開始したいと思います。ただし、統合モードに切り替えることができないという奇妙な問題が発生しています。試行すると、アプリケーションはフォームデータの受信を停止します。(つまり、データはPOSTメソッドを介して送信されます。)
Global.aspxファイルに大量のログを追加することで、フォームデータが失われる場所を絞り込むことができました。これが起こっているようです。
リクエストを受信すると、
Application_BeginRequest
イベントが発生します。この時点で、フォームデータが存在し、リクエストオブジェクトForms
またはParams
プロパティを調べることで確認できます。Url
この時点でのリクエストのプロパティには、「。mvc」拡張子がどこにもありません。(これについては以下で詳しく説明します。)次に、
Application_AuthenticateRequest
イベントが発生します。この場合も、フォームデータが存在し、URLには「.mvc」拡張子がありません。この時点で、私が期待するのは、
Application_PostAuthenticateRequest
イベントが発生することです。しかし、実際に起こることは、それApplication_BeginRequest
が再び呼び出されることです。今回は、フォームデータがなくなりました。、、、またはその他のForms
場所にはParams
ありません。さらに、URLが変更され、URLのコントローラー名の部分に「.mvc」拡張子が付加されるようになりました。たとえば、手順1と2のURLが「/ Education / Manage」の場合、手順3では「/Education.mvc/Manage」と表示されます。Application_AuthenticateRequest
イベントが再度発生します。この場合も、フォームデータが欠落しており、URLには「.mvc」拡張子が埋め込まれています。今回
Application_PostAuthenticateRequest
はが起動され、ページの残りのライフサイクルは正常に進行します。これ以降のすべてのイベントでは、フォームデータはなく、「。mvc」拡張子は引き続き存在します。
この問題は、統合パイプラインモードに切り替えた場合にのみ発生します。クラシックモードでは正常に動作します。私は何日もグーグルをしてきましたが、残念ながら、同様の問題への言及を見つけることができませんでした。私はまた、運がなくても問題を解決することを期待して、いくつかの異なる方法でWeb.configファイルを編集しようとしました。ここの誰かがこの問題に光を当てることができることを願っています。
関連するコードスニペットをいくつか示します。他に含める必要のあるコードがある場合は、お知らせください。
Web.configから:
<system.web>
<authentication mode="Forms">
<forms name=".appLive" timeout="60" enableCrossAppRedirects="true" path="/" />
</authentication>
[...]
</system.web>
[....]
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="ScriptModule" />
<remove name="UrlRoutingModule" />
<add name="ScriptModule" preCondition="managedHandler" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<remove name="FormsAuthenticationModule" />
<remove name="UrlAuthorization" />
<remove name="DefaultAuthentication" />
<add name="DefaultAuthentication" type="System.Web.Security.DefaultAuthenticationModule" />
</modules>
<handlers>
<remove name="AboMapperCustom-17403419" />
<remove name="WebServiceHandlerFactory-Integrated" />
<remove name="ScriptHandlerFactory" />
<remove name="ScriptHandlerFactoryAppServices" />
<remove name="ScriptResource" />
<add name="ScriptHandlerFactory" verb="*" path="*.asmx" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add name="ScriptHandlerFactoryAppServices" verb="*" path="*_AppService.axd" preCondition="integratedMode" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add name="ScriptResource" preCondition="integratedMode" verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add name="MvcHttpHandler" preCondition="integratedMode" verb="*" path="*.mvc" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add name="UrlRoutingHandler" preCondition="integratedMode" verb="*" path="UrlRouting.axd" type="System.Web.HttpForbiddenHandler, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<add name="AboMapperCustom-17403419" path="*.mvc" verb="GET,POST,HEAD,DEBUG" modules="IsapiModule" scriptProcessor="C:\Windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll" resourceType="Unspecified" requireAccess="Script" preCondition="classicMode,bitness32,runtimeVersionv2.0" responseBufferLimit="0" />
</handlers>
</system.webServer>
Global.aspxから:
public void Application_BeginRequest(Object source, EventArgs e)
{
HttpApplication application = source as HttpApplication;
if (source != null)
{
if (application.Request.AppRelativeCurrentExecutionFilePath.Contains(".mvc"))
{
application.Context.RewritePath(application.Request.Url.PathAndQuery.Replace(".mvc", string.Empty));
}
}
}