10

创建自定义 IHttpModules,我意识到对静态文件(例如:.css 和 .js 文件)的请求正在命中托管模块。可能图片也有同样的问题。对于文件系统中存在的文件,IIS 不应该绕过 ASP.NET 吗?

例如:

public class MyModule:IHttpModule
{
    public void Dispose(){ }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += (o, e) => Debug.Print("Request: " + HttpContext.Current.Request.RawUrl);
    }
}

我这样声明:

<modules runAllManagedModulesForAllRequests="true">
  <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX"/>
</modules>

但是,即使使用前提条件,我也可以看到静态文件如何通过模块:

Request: /MVCX/
Request: /MVCX/Content/Site.css
Request: /MVCX/Scripts/jquery-1.4.4.min.js

我试图忽略静态文件的规则,但这并没有什么不同:

routes.IgnoreRoute("{Content}/{*pathInfo}");
routes.IgnoreRoute("{Scripts}/{*pathInfo}");

这是平常的吗?或者我在这里错过了什么?据我所知,如果静态文件请求应该由 IIS 回答。如果我的托管模块被命中,则意味着 CLR ThreadPool 线程正在处理该请求,对吗?

问候。

更新:

我已禁用“runAllManagedModulesForAllRequests”:

<modules runAllManagedModulesForAllRequests="false">
      <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX" />
</modules>

一切似乎都很好,但我发现这篇文章:http ://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html 建议删除并阅读“UrlRoutingModule-4.0 " 具有空前提条件的模块。

在我的机器上,该模块的添加位于根 web.config 中,并且它已经有一个空的前置条件:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type machine.config | find "UrlRouting"


C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type web.config | find "UrlRouting"
            <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>

所以现在我有点困惑,这个参数的状态是什么?我应该使用它还是不应该使用它?为什么默认情况下它是“真实的”?

问候。

4

5 回答 5

9

回答关于 IIS 应该绕过 ASP.NET 获取静态内容这一事实的第一个问题。

如果在集成模式下配置,IIS 7.5 将允许托管模块注册与传统上不由 ASP.NET 处理的请求相关的事件,例如静态文件。

这在 IIS 7.5 经典模式中不会发生,该模式类似于 IIS 6,并且不允许托管模块侦听未由 ASP.NET 处理的请求中的事件。

因此,基本上,如果您runAllManagedModulesForAllRequests="true"使用集成模式,那么您的托管模块将收到每个请求的事件通知。另外,从文档中runAllManagedModulesForAllRequests

如果所有托管模块都可以处理所有请求,则为真,即使该请求不是针对托管内容的;否则为假。

默认值为假。

文档没有解释此属性如何与preCondition选项交互。根据您的经验,它似乎覆盖了preCondition配置,所以如果您是我,我会将其保留在原处false并仅使用preCondition选项,即使这意味着将其他模块的先决条件更改为空字符串以解决更改runAllManagedModulesForAllRequests为 false 的问题。


更新: 找到了一些关于使用的影响的文档,runAllManagedModulesForAllRequests并且如前所述,如果为真,是对preConditionwithmanagedHandler选项的覆盖。

您还可以使用快捷方式来启用所有托管 (ASP.NET) 模块以针对应用程序中的所有请求运行,而不管“managedHandler”前提条件如何。要使所有托管模块能够针对所有请求运行,而无需配置每个模块条目以删除“managedHandler”前置条件,请使用以下部分中的 runAllManagedModulesForAllRequests 属性:

当您使用此属性时,“managedHandler”前置条件无效,并且所有托管模块都会针对所有请求运行。

于 2011-12-07T16:06:47.367 回答
6

在我的机器上,该模块的添加位于根 web.config 中,并且它已经有一个空的前置条件

完美的。这意味着该模块将始终运行,这是 MVC 所需的,因为它使用无扩展名 url。

所以现在我有点困惑,这个参数的状态是什么?我应该使用它还是不应该使用它?为什么默认情况下它是“真实的”?

因为无扩展 url 支持在 IIS7 SP1 和 IIS7.5 SP1 中是新的。它可用于 IIS7 作为您必须请求和安装的补丁程序。您可以在这里找到问题的完整答案:http: //support.microsoft.com/kb/980368

为什么这个参数默认为真?因为 VS2010 是在 IIS7 SP1 之前发布的。也许它在 VS2010SP1 的新 MVC 项目中是错误的?

于 2011-12-10T22:24:56.707 回答
2

您可以为它编写以下代码。

routes.IgnoreRoute("{*allcss}", new { allaspx = @".*\.css(/.*)?" });
routes.IgnoreRoute("{*alljs}", new { allaspx = @".*\.js(/.*)?" });

请在以下链接中找到更多信息

http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extension.aspx

于 2011-12-09T06:30:50.067 回答
1

我想,如果你真的想忽略,你不应该使用弯括号:

routes.IgnoreRoute("Content/{*pathInfo}");
routes.IgnoreRoute("Scripts/{*pathInfo}");
于 2011-12-05T15:54:05.983 回答
0

试试这个忽略所有静态文件的列表

routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(js|css|gif|jpg|png)(/.*)?" });
于 2015-07-14T21:09:26.310 回答