我收到了使用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”确实传递给控制器工厂,这是我真正不知道的。
有人可以对此有所了解吗?
当超越控制器工厂以避免此类问题时,应该采取什么样的处理?
答案 0 :(得分: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 :(得分:19)
经过一番研究后,我从史蒂文桑德森的书中找到了以下引用:
但是,路由系统仍会检查文件系统以查看传入的URL是否恰好与文件或磁盘匹配,如果是,则路由忽略该请求(绕过URL也可能匹配的任何路由条目) )以便直接提供文件。这对于静态文件非常方便,例如图像,CSS和JavaScript文件。您可以将它们保存在项目中(例如,在/ Content或/ Script文件夹中),然后直接引用和提供它们,就像您根本不使用路由一样。由于该文件确实存在于磁盘上,因此优先于您的路由配置。
相反,如果您希望路由配置优先于磁盘上的文件,则可以将RouteCollection的RouteExistingFiles属性设置为true。 (默认情况下这是假的。)
这是非常有趣的东西,让我了解实际问题。一个更简单的一个。事实上,文件夹中没有相关的脚本。至少不是在视图上请求完全相同版本的那些。这是负责Asp.Net MVC认为它是一个控制器/动作请求。