21

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

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

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

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

所以:

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

感谢您的帮助

编辑

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

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

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

我们之前的加载数量确实被低估了,实际上他们每天有超过一百万的访问者,大约每天加载 1400 万页。

4

7 回答 7

7
  1. 是的。即使您可以缓存结果,HTML 页面也总是会更快并使用更少的服务器资源
  2. 一个好方法是将剃刀视图转换为文本,然后将文本保存为 html 文件。
  3. 另一种方法是使用T4 模板,但我推荐 Razor。
于 2012-06-25T11:19:52.013 回答
3

您可以使用 Razor 引擎(NuGet-link,他们的网站),这样您就可以从控制台应用程序创建模板,而无需使用 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);
        }
    }
}
于 2012-06-25T12:16:46.273 回答
2

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

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

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

于 2012-06-25T11:13:56.800 回答
1

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

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

于 2012-09-17T07:16:19.150 回答
0

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

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

于 2012-06-25T11:14:07.163 回答
0

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

于 2012-06-25T11:15:00.607 回答
0

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

我计划每天执行一项任务,即抓取网站上的特定页面以使其更快,例如每天只抓取 /news。

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

于 2015-05-09T23:06:13.067 回答