如何检测子请求?

时间:2010-10-12 17:58:40

标签: c# asp.net iis

我正在尝试在C#中创建一个HttpModule,它将重定向任意URL和丢失的文件,并对所有进入的URL执行规范化。我的规范化过程的一部分是从默认文档重定向(例如{{3到一个裸目录。 (如http://www.contoso.com/default.aspx

我发现当IIS服务器收到裸目录的请求时,它会正常处理此请求,然后它会为所选的默认文档创建子请求。这在我的模块中产生了一个重定向循环 - 第一个请求通过就好了,但是当它看到子请求时它会从url中删除默认文档并重定向回裸目录,再次启动该过程。

显然,我需要解决这个问题的方法是让我的模块知道它何时看到子请求,以便它可以忽略它。但我在网上找不到任何描述如何区分两个请求的内容。我发现请求标头在两个请求之间保持不变,所以我尝试在请求标头中添加一个值,然后查找该值。这在IIS 7中有效,但显然IIS 6不允许您更改请求标头,我的代码需要在两者中运行。

2 个答案:

答案 0 :(得分:0)

这些子请求也可以由代码中的任何Server.TransferServer.Executes触发。用于检测子请求的一个技巧是在第一个请求期间添加自定义请求标头并稍后检查它(在子请求中)。例如:

private bool IsChildRequest(HttpRequest request)
{
  var childRequestHeader = request.Headers["x-parent-breadcrumb"];
  if (childRequestHeader != null) 
  {
    return true;
  }

  request.Headers["x-parent-breadcrumb"] = "1"; // arbitrary value
  return false;
}

这是有效的,因为请求标头被传递给子请求。我最初尝试使用HttpContext.Current.Items,但似乎重置了子请求。

答案 1 :(得分:-1)

您的模块正在发生的事情完全应该如此。如果您的默认页面是Default.aspx,则IIS必须重定向到Default.aspx,这会导致您的模块重做工作。但有一件事我不明白,为什么你要将http://www.contoso.com/default.aspx重定向到http://www.contoso.com?可能你需要重新定义你的要求。或者,如果可能的话,你可以有另一个默认页面(如http://www.contoso.com/Home.aspx),然后你的IIS应该将裸请求转发到该URL。

相关问题