asp.net-mvc-4 - ASP.NET 优化 - 捆绑

标签 asp.net-mvc-4 asp.net-optimization

我一直在 ASP.NET MVC 4 中尝试新的缩小和捆绑功能,只要您使用 css 和 js 文件的默认文件夹约定,它就可以很好地工作。

/Content
/Scripts

我通常将 css 和脚本放在一个名为 Static 的文件夹中
/Static/Css
/Static/Js

我试图像这样注册我自己的包:
public static class BundleCollectionExtensions
{
    public static void RegisterScriptsAndCss(this BundleCollection bundles)
    {
        var bootstrapCss = new Bundle("~/Static/Css", new CssMinify());
        bootstrapCss.AddDirectory("~/Static/Css", "*.css");
        bootstrapCss.AddFile("~/Static/Css/MvcValidation.css");
        bootstrapCss.AddFile("~/Static/Css/bootstrap-responsive.min.css");
        bootstrapCss.AddFile("~/Static/Css/bootstrap.min.css");

        bundles.Add(bootstrapCss);

        var bootstrapJs = new Bundle("~/Static/Js", new JsMinify());
        bootstrapJs.AddDirectory("~/Static/Js", "*.js");
        bootstrapJs.AddFile("~/Static/Js/jquery-1.7.1.min.js");
        bootstrapJs.AddFile("~/Static/Js/jquery.validate.min.js");
        bootstrapJs.AddFile("~/Static/Js/jquery.validate.unobtrusive.min.js");
        bootstrapJs.AddFile("~/Static/Js/bootstrap.min.js");
        bootstrapJs.AddFile("~/Static/Js/gunsforhire.js");

        bundles.Add(bootstrapJs);
    }
}

而在
Global.ascx.cs

我这样做了:
BundleTable.Bundles.RegisterScriptsAndCss();

生成的标记如下所示:
<link href="/Static/Css?v=D9JdmLZFFwjRwraNKfA1uei_YMoBoqLf-gFc0zHivM41" rel="stylesheet" type="text/css" />

<script src="/Static/Js?v=mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1" type="text/javascript"></script>

但是它不起作用,请求如下所示:
Request URL:http://localhost:49603/Static/Js?v=mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1
Request Method:GET
Status Code:301 Moved Permanently (from cache)
Query String Parametersview URL encoded
v:mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1

Request URL:http://localhost:49603/Static/Js/?v=mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1
Request Method:GET
Status Code:404 Not Found
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Host:localhost:49603
Referer:http://localhost:49603/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko)        Chrome/17.0.963.56 Safari/535.11
Query String Parametersview URL encoded
v:mbKbf5__802kj-2LS5j9Ba-wvSxBCKNMQGBgzou6iZs1
Response Headersview source
Cache-Control:private
Content-Length:4757
Content-Type:text/html; charset=utf-8
Date:Thu, 01 Mar 2012 19:05:44 GMT
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET
X-SourceFiles:=?UTF-8?B?   QzpcQENvZGVccGVsbGVccGVsbGVoZW5yaWtzc29uLnNlXHNyY1xXZWJcU3RhdGljXEpzXA==?=

我究竟做错了什么?

更新

我想我终于能够通过执行以下操作来解决这个问题:
  • 删除 AddDirectory 调用 bootstrapCss.AddDirectory("~/Static/Css", "*.css");
  • 给出不反射(reflect)真实目录结构的包路径
  • 最佳答案

    你在做什么“错误”是你的包路径对应于一个真实的路径。据我了解,当“/Static/Css?v=D9JdmLZFFwjRwraNKfA1uei_YMoBoqLf-gFc0zHivM41”的请求进来时,路由引擎首先寻找物理路径。它找到与您的文件夹“static”匹配的文件,并尝试在其中找到与“Css?v=D9JdmLZFFwjRwraNKfA1uei_YMoBoqLf-gFc0zHivM41”匹配的文件。当它找不到一个,因为它不存在时,它给出 404。(我也看到了访问被拒绝。)当路由引擎找不到物理文件路径时,它会寻找其他处理程序,例如捆绑和缩小以满足请求。

    无论如何,我认为您已经从您的评论中弄清楚了,但我不确定任何发现您的问题的人都会非常清楚。只需更改您的注册:

    var bootstrapCss = new Bundle("~/Static/Css", new CssMinify());
    

    到:
    var bootstrapCss = new Bundle("~/bundles/Css", new CssMinify());
    

    如果您进行更改,您的问题就会消失(当然,没有与“捆绑包”相对应的物理路径。

    关于asp.net-mvc-4 - ASP.NET 优化 - 捆绑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9522407/

    相关文章:

    c# - Web api 中的请求始终为空?

    c# - MVC4 ajax 表单不工作

    CSS 缩小和 bundle 在 calc 中将 0px 替换为 0,因此内容无法正确呈现

    c# - 使用 LINQ 进行 ASP MVC 分页?

    c# - TextBoxFor() 不生成验证标记

    javascript - 在mvc4中使用ajax.actionlink导致刷新页面

    asp.net-mvc - 本地化的脚本包解决方案

    jquery - 如何申请定制 bundle 订单?

    asp.net - 从 ASP.NET MVC 4 中的部分或编辑器模板触发包包含

    asp.net-mvc-4 - mvc 4 bundle 和缩小 - 刷新时未获得 304(未修改)