【问题标题】:Why CSS and JS files bypass Asp.Net MVC routes?为什么 CSS 和 JS 文件绕过 Asp.Net MVC 路由?
【发布时间】:2013-06-01 16:26:06
【问题描述】:

我收到了一个使用 Asp.Net MVC4 构建的原型应用程序。它目前正在使用 NInject、ServiceLocator 和所有的自定义控制器工厂替换默认控制器工厂。

问题在于,通过替换默认控制器工厂,对 JS 文件的请求被视为对控制器和操作的合法请求。

因此,查看 Visual Studio 创建的默认模板,路由配置如下所示:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id =   UrlParameter.Optional }
    );
}

看完之后,我问自己:为什么对“/Scripts/jquery.js”的请求没有被 Asp.Net MVC 解释?我的意思是,为什么它不认为“脚本”是一个控制器而“jquery.js”是一个动作?

因为如果我禁用控制器工厂覆盖,项目就可以工作,我只能假设默认工厂负责这种检查。这意味着“/Scripts/jquery.js”确实被传递给了控制器工厂,这是我不知道的。

有人能解释一下吗?

在重写控制器工厂时应该做什么样的处理以避免此类问题?

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-mvc-routing


    【解决方案1】:

    这不是因为 MVC 如何处理对 jquery.js 的请求,而是因为 IIS 处理对 jquery.js 的请求的方式。 IIS 假定 .js、.jpg 等资源都是静态资源,因此不需要通过 ASP.NET 引擎传递它们。为了防止这种情况发生,您可以在 web.config 中添加一行以获取您希望 IIS 单独保留的路径。

    <system.webserver>
        <handlers>
        <add name="scripts" path="/Scripts/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
        </handlers>
    </system.webserver>
    

    添加类似的内容应该允许您的 JS 文件通过 ASP.NET 而不是直接通过 IIS 提供服务。

    【讨论】:

    • +1,感谢您提醒我有关 web.config 的处理程序部分及其设置方式。我找到了解决我的问题的方法。检查我的答案。再次感谢您的帮助。
    • 没问题。前几天我几乎遇到了这个确切的问题。我完全忘记了文件是如何处理的。
    【解决方案2】:

    经过更多研究后,我从 Steven Sanderson 的书中找到了以下引述:

    但是,路由系统仍然会检查文件系统以查看传入的 URL 是否恰好与文件或磁盘匹配,如果是,路由会忽略该请求(绕过该 URL 也可能匹配的任何路由条目) 以便直接提供文件。这对于静态文件非常方便,例如图像、CSS 和 JavaScript 文件。您可以将它们保存在您的项目中(例如,在您的 /Content 或 /Script 文件夹中),然后直接引用和提供它们,就像您根本不使用路由一样。由于该文件确实存在于磁盘上,因此优先于您的路由配置。

    如果您希望路由配置优先于磁盘上的文件,则可以将 RouteCollection 的 RouteExistingFiles 属性设置为 true。 (默认为 false。)

    这是一件非常有趣的事情,让我找到了实际的问题。一个更简单的。碰巧的是,文件夹中没有相关的脚本。至少不是那些在视图上请求的版本完全相同的版本。这就是 Asp.Net MVC 认为这是一个控制器/动作请求的原因。

    参考:http://forums.asp.net/t/1536510.aspx/1

    【讨论】:

    • 可能工作 RouteExistingFiles 为 true 并在 weblogs.asp.net/jongalloway/… 的 web.config 参考中添加这一行 &lt;add name="HtmlFileHandler" path="*.html" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /&gt;
    【解决方案3】:

    检查在您的链接或脚本之前使用“~/”,例如: src="~/assets/js/main.js"

    【讨论】:

      猜你喜欢
      • 2011-02-26
      • 2012-06-30
      • 1970-01-01
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2017-05-13
      • 1970-01-01
      • 2013-09-01
      相关资源
      最近更新 更多