有没有办法在包名称中包含文件扩展名?

15

我想定义一个类似这样的bundle:

bundles.Add(
    new StyleBundle("~/style.css").Include(
        //...
));
如果包名称只是"~/style",那么这个可以工作,但是带有文件扩展名时它总是返回404。我怀疑服务器在驱动器上搜索CSS和JS文件并忽略捆绑系统,但我找不到其他任何试图在捆绑名称中包含文件扩展名的人。是否可能在没有URL重写之类的东西的情况下进行此操作?
1个回答

24

你可以将以下内容添加到web.config的<system.webServer>部分中:

<modules runAllManagedModulesForAllRequests="true" />

这将确保对于静态资源,例如.js.css的请求将通过托管模块,并被ASP.NET MVC拦截。

作为启用runAllManagedModulesForAllRequests的替代方案,您可以仅对需要使用的URL进行配置。所以在<handlers>中添加以下内容:

<handlers>
    <!-- ... -->
    <add name="scriptBundle" verb="*" path="script.js" type="System.Web.Optimization.BundleHandler, System.Web.Optimization" preCondition="managedHandler" />
    <add name="cssBundle" verb="*" path="style.css" type="System.Web.Optimization.BundleHandler, System.Web.Optimization" preCondition="managedHandler" />
</handlers>

3
有没有一种不那么激进的解决方案,只影响.js和.css文件? - sbking
1
+1 但是如果 path="*.bundle.js",将会阻止处理程序对真实文件的运行。 - Fabio Milheiro
我想知道第二种解决方案(添加单个处理程序)是否有一些缺点。在某些情况下,它确实似乎有效,但我也偶尔会在日志中看到错误信息,如 Unhandled application error: System.MissingMethodException: Constructor on type 'System.Web.Optimization.BundleHandler' 。显然,BundleHandler没有无参数构造函数。这应该如何工作(即我们依赖哪种行为?) - Johannes Rudolph
关于我之前的评论,我已经确认了异常情况发生在请求指向正确的捆绑路径但是带有错误的捆绑版本参数(例如/x/bundle.js?v=12345)的情况下。我相信这可以通过一些其他的技巧来解决(并返回适当的404)。 - Johannes Rudolph

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