为什么CSS和JS文件绕过Asp.Net MVC路由?

26

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

问题在于,通过替换默认控制器工厂,JS文件的请求被视为请求控制器和操作,而不是合法的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 }
    );
}

看完这个问题,我想知道:为什么Asp.Net MVC没有解释对“/Scripts/jquery.js”的请求?我的意思是,为什么它不认为"Script"是一个控制器,"jquery.js"是一个操作?

由于如果我禁用控制器工厂覆盖,该项目可以正常工作,因此我只能假设默认工厂对这种检查负责。这意味着"/Scripts/jquery.js"确实被传递给了控制器工厂,而我之前并不知道这一点。

有人可以解释一下吗?

在覆盖控制器工厂时,应该进行什么样的处理以避免出现此类问题?

3个回答

32

这不是因为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处理程序部分及其设置方式。我已经找到了解决我的问题的方法。请查看我的答案。再次感谢您的帮助。 - Rodrigo Lira
没问题。我前几天遇到了几乎完全相同的问题。我已经完全忘记了文件是如何处理的。 - ThaBigGuy

20
经过进一步调查,我在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,并在web.config引用中添加以下行:<add name="HtmlFileHandler" path="*.html" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />。参考http://weblogs.asp.net/jongalloway/asp-net-mvc-routing-intercepting-file-requests-like-index-html-and-what-it-teaches-about-how-routing-works。 - Alexsandro

0

请确保在链接或脚本前使用"~/",例如: src="~/assets/js/main.js"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接