使用razor/asp.net mvc3生成静态html页面?

Posted

技术标签:

【中文标题】使用razor/asp.net mvc3生成静态html页面?【英文标题】:Use razor/asp.net mvc3 to generate static html pages? 【发布时间】:2012-06-26 15:21:30 【问题描述】:

对于一个项目,我必须生成静态 .html 页面,这些页面将发布到远程服务器上。

我必须通过 c# 代码自动创建这些文件,该代码从 SQL Server 数据库中获取数据。

数据不会经常更改(每 4-5 个月一次),并且该网站的访问量会很高。

由于我发现asp.net MVC3 的razor 合成器非常有效,我想知道是否可以使用asp.net MVC3/Razor 来生成那些.html 页面?

所以:

    这是个好主意吗? 如果是,有什么好的方法? 如果你想用另一种好的方式来做这件事,哪种方式?

感谢您的帮助

编辑

关于答案,我需要准确地说:我不想/不需要使用 Web 缓存,原因有很多(加载(每月加载数百万个页面)、集成(我们将页面集成到优化的apache 与,网站的另一部分),页面数(缓存只会在我有很多时间相同的页面时对我有帮助,但我会有〜 2500 页,所以根据墨菲定律,除非我放了一个非常高速缓存超时,我将不得不经常生成它们)。所以我真的搜索了一些东西来生成 HTML 页面。

编辑 2 我刚得到一个新的约束:/那些模板必须本地化。这意味着我应该有相当于以下剃须刀代码的东西:@MyLocalizationFile.My.MyValue

编辑 3 目前,我正在考虑做一个动态网站,并在其上调用一些 http 查询,以存储生成的 HTML。但是,有没有办法避免http?意思是模拟一个http调用,指定输出流和调用的url(只有GET调用)。

我们之前的加载量确实被低估了,实际上他们每天的访问量略高于 100 万,约 1400 万页/天。

【问题讨论】:

我同意你的观点,存储静态 html 是最有效的方式,而且大多数情况下比使用输出缓存或其他缓存机制要好得多。 我最近听说过 DocPad,它基本上可以满足您的要求,除了它不是 ASP.Net 或 Razor。我希望有像 DocPad 这样的 ASP.Net/MVC3/Razor 产品。我认为有一个地方可以使用动态渲染引擎来创建静态站点。我与多个将从这个想法中受益的网站合作。当您进行更新时,您重新生成站点并再次上传整个站点或使用差异工具过滤掉更改的文件并上传这些文件。 【参考方案1】:
    是的。即使您可以缓存结果,HTML 页面也总是会更快并使用更少的服务器资源 一个好方法是转换your razor views into text,然后将文本保存为html文件。 另一种方法是使用T4 templates,但我推荐使用 Razor。

【讨论】:

您的第 2 点很有趣。有没有办法让控制器从控制台应用程序呈现这些剃刀视图? @J4N 你搞定了吗?我也有兴趣解决我面临的类似问题,我还希望存储为基于 asp.net mvc3 构建的站点生成的静态 html 页面。如果您找到解决方案,请在此处更新...谢谢 你觉得这个有用吗..awesome.codeplex.com/…【参考方案2】:

我正在研究类似的解决方案。我的网站在暂存环境中正常运行(ASP.NET + DB + CMS),然后我使用 wget 抓取它并生成静态 html 页面。然后将这些静态 html 页面(包括资产)上传到 Amazon S3 存储桶。这样,网站就变成了完全静态的,没有依赖关系。

我计划执行一项日常任务,即抓取网站上的特定页面以加快速度,例如每天只抓取 /news。

我知道您已经找到了解决方案,但也许这个答案可能对其他人有所帮助。

【讨论】:

能否请您详细说明,如果可能的话,请提供 github repo。目前需要这样做。【参考方案3】:

最后我创建了一个普通的 asp.net MVC 网站,然后使用 WebClient 在页面上生成页面。

这样我可以预览网站,我可以享受 Razor+MVC 助手的全部功能。

【讨论】:

【参考方案4】:

您可以使用 Razor 引擎(NuGet-link,他们的website),这样您就可以从控制台应用程序创建模板,而无需使用 asp.net MVC。

我是这样使用的:

public string ParseFile<T>(string fileName, T model) 
    var file = File.OpenText(fileName);
    var sb = new StringBuilder();
    string line;
    while ((line = file.ReadLine()) != null)
    
        // RazorEngine does not recognize the @model line, remove it
        if (!line.StartsWith("@model ", StringComparison.OrdinalIgnoreCase))
            sb.AppendLine(line);
        
        file.Close();

        // Stuff to make sure we get unescaped-Html back:
        var config = new FluentTemplateServiceConfiguration(
                    c => c.WithEncoding(RazorEngine.Encoding.Raw));

        string result;
        using (var service = new TemplateService(config))
        
            return service.Parse<T>(sb.ToString(), model);
        
    

【讨论】:

有没有办法在这个解决方案中使用模板文件(cshtml)? 这似乎真的很接近我的想法。让我几天来测试一下:) 只有一个问题,模板是否有效?和部分观点?因为我将有 60% 以上的观点永远不会改变 好问题,我没有尝试过 partials,我认为这不会起作用,因为引擎是基于字符串的,而不是像 MVC 中的 razor 那样基于文件的 我在作者的博客上看到它是为 V3 计划的(也是部分视图)【参考方案5】:

查看 T4 模板或类似的模板解决方案

【讨论】:

【参考方案6】:

您遇到的任何性能原因是否值得预渲染网站?我们在谈论多少页?您的控制器采用什么样的参数?如果香草缓存不能满足您的要求,对我来说最好的方法是基于磁盘的缓存提供程序......

http://www.juliencorioland.net/Archives/en-aspnet-mvc-custom-output-cache-provider

【讨论】:

~2500个网页,这是一个官方网站,可以访问5种语言的法律元素。缓存不是我需要的。【参考方案7】:

我认为与其生成静态的 HTML 页面,不如每次动态生成页面,但使用缓存来提高性能。

有关更多信息,请参阅这篇关于使用 ASP.NET MVC3 进行缓存的文章:

http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/improving-performance-with-output-caching-cs

【讨论】:

我很清楚缓存,但这不是我要问的。我就是不能。我们的网页将被整合到一个更大的网站中(在 apache 上运行)。 @J4N 由于缓存很可能是您问题的明显解决方案,因此我会编辑您的问题以指定您不想使用缓存来避免更多与缓存相关的答案。

以上是关于使用razor/asp.net mvc3生成静态html页面?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Razor ASp.NET MVC 连接 HTML 元素的 id

如何为有条件的必需属性实现客户端验证 - Razor ASP.NET 核心

MVC3 里添加一个静态网页为啥访问不到?

如何在 MVC3 中使用 https 生成绝对 URL?

如何在 ASP.NET MVC3 中通过 HTTPS 提供静态文件(在 ~/Content 中)

MVC3 razor 获取视图中的浏览器屏幕宽度和高度