IIS - 在Integrated Pipeline模式下对默认文档的不同处理?

时间:2009-02-27 03:20:20

标签: asp.net iis iis-7 httpmodule

我有一个HTTP模块来处理来自Facebook的身份验证,这在经典管道模式下工作正常。

但是,在集成管道模式下,我看到默认文档的其他请求通过,导致模块失败。我们查看请求(来自Facebook)以检索和验证访问我们的应用程序的用户。初始请求验证正常,但后来我看到第二个请求,它缺少已发布的表单变量,从而导致身份验证失败。

在集成管道模式下,“/”的http请求连续产生2个AuthenticateRequests:

  1. AppRelativeCurrentExecutionFilePath =“〜/”
  2. 的请求
  3. AppRelativeCurrentExecutionFilePath =“〜/ default.aspx”
  4. 的请求

    第二个请求丢失了所有表单值,因此无法进行身份验证。在经典模式中,第二个请求是唯一发生的请求,它会保留表单值。

    有什么想法在这里发生了什么?

    更新:以下是IIS中模块通知的跟踪图像。请注意,我的模块FBAuth多次看到AUTHENTICATE_REQUEST(我希望2 - 一个用于身份验证,一个用于postauthenticate,但我得到4)。

    Events raised multiple times

    我开始相信这与模块/过滤器配置有关,因为我发现一个(Vista)框运行相同的代码,不会反复触发这些事件 - 它的行为与预期一致。我正在努力弄清楚差异可能是什么......

    谢谢! 汤姆

2 个答案:

答案 0 :(得分:1)

您找到了解决方案吗?我的目的是在Application_BeginRequest结束时添加以下代码:

if (Request.RawUrl.TrimEnd('/') == HostingEnvironment.ApplicationVirtualPath.TrimEnd('/'))
    Server.Transfer(Request.RawUrl+"Default.aspx", true);

答案 1 :(得分:0)

  

不支持DefaultHttpHandler,   所以应用程序依赖于子类   DefaultHttpHandler将无法使用   服务请求如果您的申请   使用DefaultHttpHandler或处理程序   派生自DefaultHttpHandler,   它将无法正常运作。在   集成模式,源自的处理程序   DefaultHttpHandler将无法执行   将请求传递回IIS for   处理,而不是服务   请求的资源为静态文件。   集成模式允许ASP.NET模块   无需运行所有请求   要求使用   DefaultHttpHandler。

解决方法

     

更改您要使用的应用程序   用于执行请求处理的模块   对于所有请求,而不是使用   通配符映射将ASP.NET映射到所有   请求然后使用   DefaultHttpHandler派生的处理程序   将请求传递回IIS。

  嗯,或者这可能是问题。

  早期请求ASP.NET模块   处理阶段将看到请求   以前可能已被拒绝   在进入ASP.NET之前通过IIS   其中包括运行的模块   BeginRequest看到匿名请求   对于需要的资源   身份验证ASP.NET模块可以运行   在任何管道阶段   可用于本机IIS模块。   因此,请求   以前可能已被拒绝了   认证阶段(如   匿名请求资源   要求认证)或其他   进入ASP.NET之前的阶段可能   运行ASP.NET模块。这种行为是   按设计,以启用ASP.NET   模块在所有请求中扩展IIS   处理阶段。

解决方法

     

更改应用程序代码以避免   任何特定于应用程序的问题   看到可能的请求   在请求期间稍后拒绝   处理。这可能涉及改变   订阅管道的模块   稍后提出的事件   请求处理。   http://learn.iis.net/page.aspx/381/aspnet-20-breaking-changes-on-iis-70/