2009-02-27 60 views
2

我有一个HTTP模块来处理来自Facebook的身份验证,在传统的管道模式下工作正常。IIS - 集成管道模式下对默认文档的不同处理?

但是,在集成管道模式下,我看到一个额外的请求传递给默认文档,导致模块失败。我们查看来自Facebook的请求以检索并验证访问我们应用的用户。初始请求认证正常,但后来我看到第二个请求,它缺少发布的表单变量,从而导致认证失败。

在集成管道模式,为 “/” 的产率2个AuthenticateRequests连续的HTTP请求:

  1. 的请求,其中AppRelativeCurrentExecutionFilePath = “〜/”
  2. 的请求,其中AppRelativeCurrentExecutionFilePath =“〜/默认.aspx“

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

任何想法这里发生了什么?

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

Events raised multiple times

我开始相信这事做与模块/过滤器的配置,因为我发现运行不重复触发这些事件相同的代码(Vista)的盒子 - 它的行为如预期。我正在努力通过试图找出差异可能是什么...

谢谢! 汤姆

回答

0

不支持DefaultHttpHandler, 所以应用依赖于特定的子类DefaultHttpHandler的 将无法​​ 服务请求,如果您的应用程序 使用DefaultHttpHandler或处理 从DefaultHttpHandler派生, 也不会功能正常。在 集成模式下,来自 DefaultHttpHandler的处理程序将无法将 将请求传回给IIS,以便处理 ,并将请求的资源作为静态文件提供服务。 集成模式允许ASP.NET模块 针对所有请求运行,而不需要 需要使用 DefaultHttpHandler。

解决方法

更改应用程序以使用 模块以执行请求处理 所有请求,而不是使用 通配符映射到ASP.NET映射到所有 请求,然后使用 DefaultHttpHandler衍生处理程序 通请求回到IIS。

嗯,或者这可能是问题。在早期的请求 处理阶段

ASP.NET模块将会看到,先前可能已进入ASP.NET, ,其包括在 的BeginRequest运行的模块看到匿名请求 用于需要 资源之前拒绝由IIS 请求 身份验证ASP.NET模块可以在 可用于本机IIS模块的任何流水线阶段运行 。 正因为如此,要求将 先前可能已在 拒绝认证阶段或其它 阶段(如 对于 需要认证的资源匿名请求)之前进入ASP.NET可以 运行ASP.NET模块。此行为设计为 ,以便使ASP.NET 模块能够在所有请求 处理阶段中扩展IIS。

解决方法

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

+0

伟大的链接,尽管我不相信我遇到过这些问题。我正在使用一个模块,而不是一个处理程序,并且我正在监视的事件是身份验证事件。虽然这可能解释了为什么我看到它两次,但这并不能解释为什么http信息丢失(例如,形式变量)。 – 2009-02-28 03:01:06

1

您是否找到解决方案?我在Application_BeginRequest结尾处添加了以下代码:

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