Asp.net mvc 表单数据在身份验证过程中丢失--但仅在集成管道模式下丢失

Asp.net mvc 表单数据在身份验证过程中丢失--但仅在集成管道模式下丢失,asp.net-mvc,iis-7,forms-authentication,integrated-pipeline-mode,Asp.net Mvc,Iis 7,Forms Authentication,Integrated Pipeline Mode,我维护一个ASP.NET MVC应用程序(版本1),该应用程序当前以经典模式在IIS 7上运行。我们希望开始以集成管道模式运行应用程序。然而,我遇到了一个奇怪的问题,它阻止我们切换到集成模式——当我们尝试时,应用程序停止接收表单数据。(即通过POST方法发送数据。) 通过向Global.aspx文件添加大量日志记录,我能够缩小表单数据丢失的位置。下面是正在发生的事情 收到请求后,将触发应用程序\u BeginRequest事件。此时,表单数据已经存在,可以通过检查请求对象的forms或Param

我维护一个ASP.NET MVC应用程序(版本1),该应用程序当前以经典模式在IIS 7上运行。我们希望开始以集成管道模式运行应用程序。然而,我遇到了一个奇怪的问题,它阻止我们切换到集成模式——当我们尝试时,应用程序停止接收表单数据。(即通过POST方法发送数据。)

通过向Global.aspx文件添加大量日志记录,我能够缩小表单数据丢失的位置。下面是正在发生的事情

  • 收到请求后,将触发
    应用程序\u BeginRequest
    事件。此时,表单数据已经存在,可以通过检查请求对象的
    forms
    Params
    属性来查看。此时请求的
    Url
    属性中的任何地方都没有扩展名。(更多信息请参见下文。)

  • 接下来,触发
    Application\u AuthenticateRequest
    事件。同样,表单数据存在,URL没有“.mvc”扩展名

  • 此时,我希望触发
    应用程序\u PostAuthenticateRequest
    事件。但实际发生的是再次调用
    应用程序_BeginRequest
    。这一次,表单数据消失了——它不在
    forms
    Params
    或其他任何地方。此外,URL已更改,因此URL的控制器名称部分添加了一个“.mvc”扩展名。例如,如果步骤1和2中的URL是“/Education/Manage”,那么在步骤3中它显示为“/Education.mvc/Manage”

  • 再次触发
    应用程序\u AuthenticateRequest
    事件。同样,表单数据丢失,URL中嵌入了一个“.mvc”扩展名

  • 这一次,
    Application\u 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>
    

    您是否碰巧使用URL重写器或通配符映射来支持经典模式?集成模式不需要此选项,应该将其关闭。

    您是否碰巧使用URL重写器或通配符映射来支持经典模式?集成模式不需要这个,应该把它关掉。我检查了网站,结果发现我们安装了ISAPI_Rewrite。幸运的是,它不再被使用(以前依赖它的代码已经被重写),所以我能够删除它。这就解决了问题。如果你提交你的答案,我会把它标记为接受。谢谢你的帮助!
        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));
                }
            }
        }