2010-10-12 40 views
1

我想在C#中创建一个HttpModule,它将重定向任意的URL和丢失的文件,以及哪些将对所有进入的URL执行规范化。我的规范化过程的一部分是将默认文档(如http://www.contoso.com/default.aspx)重定向到裸目录。 (如http://www.contoso.com/如何检测儿童请求?

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

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

+1

不相关:我发布了一个小时后,Google搜索了“iis检测到孩子请求”,最热门的是这个问题。显然,Google对StackOverflow有很大的尊重,并且经常会将其索引为。 O_O – 2010-10-12 19:15:37

+1

SO是一个技术相关性极高的网站,我并不感到惊讶。 – Aren 2010-10-12 20:40:12

回答

-1

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

+0

我明白发生了什么,为什么会发生。我正在寻找解决正常行为的方法。而“规范化”是我想将/default.aspx转发给/的原因。请参阅http://en.wikipedia.org/wiki/Canonicalization#Search_Engines_and_SEO – 2010-10-13 17:14:53

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,但似乎得到了儿童请求的重置。