1

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

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

  1. 收到请求后,Application_BeginRequest触发事件。此时,表单数据已经出现,可以通过检查请求对象的FormsParams属性来查看。此时请求的Url属性中的任何地方都没有“.mvc”扩展名。(更多内容如下。)

  2. 接下来,Application_AuthenticateRequest触发事件。同样,存在表单数据,并且 URL 没有“.mvc”扩展名。

  3. 在这一点上,我期望发生的是Application_PostAuthenticateRequest事件触发。但实际发生的是Application_BeginRequest再次调用。这一次,表单数据消失了——它不在FormsParams或其他任何地方。此外,URL 已更改,因此 URL 的控制器名称部分添加了“.mvc”扩展名。例如,如果第 1 步和第 2 步中的 URL 是“/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));
            }
        }
    }
4

1 回答 1

2

您是否有机会使用 URL 重写器或通配符映射来支持经典模式?集成模式不需要此功能,应将其关闭。

于 2011-08-25T02:51:24.960 回答