Я поддерживаю приложение ASP.NET MVC (версия 1), которое в настоящее время работает на IIS 7 в классическом режиме. Вместо этого мы хотели бы запустить приложение в режиме интегрированного конвейера. Однако я сталкиваюсь с причудливой проблемой, которая не позволяет нам перейти в интегрированный режим - когда мы пытаемся, приложение перестает получать данные форм. (Т.е. данные отправляются методом POST.)
Добавив тонну логирования в файл Global.aspx, я смог сузить место, где данные форм теряются. Вот что, кажется, происходит.
При получении запроса происходит событие Application_BeginRequest
. На этом этапе данные форм присутствуют и их можно увидеть, изучив свойство Forms
или Params
объекта запроса. Свойство Url
запроса на данный момент не имеет расширение ".mvc" где-либо в нем. (Подробнее об этом ниже.)
Далее происходит событие Application_AuthenticateRequest
. Опять же, данные форм присутствуют, и URL не имеет расширения ".mvc".
В этот момент я ожидаю, что произойдет событие Application_PostAuthenticateRequest
. Но то, что точно происходит, это то, что Application_BeginRequest
вызывается снова. На этот раз данные форм исчезли - их нет ни в Forms
, Params
, ни где-либо еще. Кроме того, URL-адрес изменился, так что часть имени контроллера в Url имеет прикрепленное к нему расширение «.mvc». Например, если URL-адрес на шагах 1 и 2 - «/ 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));
}
}
}