Данные формы теряются в процессе аутентификации - но только в режиме интегрированного конвейера - PullRequest
1 голос
/ 23 августа 2011

Я поддерживаю приложение ASP.NET MVC (версия 1), которое в настоящее время работает на IIS 7 в классическом режиме. Вместо этого мы хотели бы запустить приложение в режиме интегрированного конвейера. Однако я сталкиваюсь с причудливой проблемой, которая не позволяет нам перейти в интегрированный режим - когда мы пытаемся, приложение перестает получать данные форм. (Т.е. данные отправляются методом POST.)

Добавив тонну логирования в файл Global.aspx, я смог сузить место, где данные форм теряются. Вот что, кажется, происходит.

  1. При получении запроса происходит событие Application_BeginRequest. На этом этапе данные форм присутствуют и их можно увидеть, изучив свойство Forms или Params объекта запроса. Свойство Url запроса на данный момент не имеет расширение ".mvc" где-либо в нем. (Подробнее об этом ниже.)

  2. Далее происходит событие Application_AuthenticateRequest. Опять же, данные форм присутствуют, и URL не имеет расширения ".mvc".

  3. В этот момент я ожидаю, что произойдет событие Application_PostAuthenticateRequest. Но то, что точно происходит, это то, что Application_BeginRequest вызывается снова. На этот раз данные форм исчезли - их нет ни в Forms, Params, ни где-либо еще. Кроме того, URL-адрес изменился, так что часть имени контроллера в Url имеет прикрепленное к нему расширение «.mvc». Например, если URL-адрес на шагах 1 и 2 - «/ Education / Manage», то на шаге 3 он отображается как «/Education.mvc/Manage".

  4. Событие Application_AuthenticateRequest вызывается снова. Опять же, данные форм отсутствуют, и в URL встроено расширение «.mvc».

  5. В этот раз запускается 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));
            }
        }
    }

1 Ответ

2 голосов
/ 25 августа 2011

Вы случайно не используете перезапись URL-адресов или сопоставление с подстановочными знаками для поддержки классического режима?Вам не нужно для интегрированного режима, и вы должны отключить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...