使用Razor/ASP.NET MVC3生成静态HTML页面?

22

为了一个项目,我需要生成静态的.html页面,并将它们发布到远程服务器。

我需要从一个C#代码中自动创建这些文件,该代码从SQL Server数据库中获取数据。

数据不经常更改(每4-5个月),并且该网站将被高频率访问。

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

所以:

  1. 这是个好主意吗?
  2. 如果是的话,应该怎么做?
  3. 如果您认为还有其他好的方式,请告诉我。

谢谢帮助

编辑

关于答案,我需要澄清:我不想/不需要使用Web缓存,有很多原因(负载(每月数百万页加载),集成(我们在优化的Apache和另一部分网站中集成页面),页面数量(只有当我有许多相同的页面时,缓存才能帮助我,但我将有约2500个页面,按照墨菲定律,除非我设置非常长的缓存超时时间,否则我将经常生成它们)。因此,我真正寻找的是生成HTML页面的方法。

编辑2

我刚刚得到了一个新的限制:这些模板必须是本地化的。这意味着我应该有与以下Razor代码等效的东西:@MyLocalizationFile.My.MyValue

编辑3

目前,我正在考虑做一个动态网站,并在其上调用一些HTTP查询,以存储生成的HTML。但是,是否有一种避免HTTP的方法?即模拟HTTP调用,指定输出流和被调用的URL(只使用GET调用)。

我们之前的负载数字被严重低估了,实际上他们每天有100多万个访问者,约1400万个页面负载/天。


我同意你的观点,存储静态HTML是最有效的方式,而且大多数情况下比使用输出缓存或其他缓存机制要好得多。 - Krunal
1
我最近听说过 DocPad,它基本上可以做到您所要求的,但它不是 ASP.Net 或 Razor。我希望有一个像 DocPad 一样的 ASP.Net/MVC3/Razor 产品。我认为使用动态渲染引擎创建静态站点是有用的。我处理多个网站,这个想法会使它们受益匪浅。当您进行更新时,重新生成站点并重新上传整个站点或使用差异工具来筛选更改的文件并上传它们。 - Steve Hiner
7个回答

7
  1. 是的。即使你可以缓存结果,HTML页面仍然会更快,使用更少的服务器资源。
  2. 一种好的方法是将你的Razor视图转换成文本,然后将文本保存为html文件。
  3. 另一种方法可以使用T4模板,但我推荐使用Razor。

你的第二点很有趣。有没有一种方法可以从控制台应用程序中控制并呈现这些 Razor 视图? - J4N
@J4N 你解决了吗?我也遇到了类似的问题,我也想存储在 ASP.NET MVC3 上构建的站点生成的静态 HTML 页面。如果你找到了解决方案,请在这里更新...谢谢。 - Krunal

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);
        }
    }
}

这个解决方案是否可以使用模板文件(cshtml)的方式? - J4N
看起来非常接近我想要的。让我试用几天 :) - J4N
只有一个问题,这样做,模板能用吗?还有局部视图?因为我将有超过60%的视图永远不会改变。 - J4N
好问题,我没有尝试过partials,而且我认为那不会起作用,因为引擎是基于字符串的,不像MVC中的razor是基于文件的。 - John Landheer
我在作者的博客上看到,V3版本计划中(包括部分视图)。 - J4N
啊,我必须在模板中处理本地化,但我不认为使用Razor引擎是可能的 :( - J4N

2

我非常了解缓存,但这不是我的问题。我只是做不到。我们的网页将被集成到一个更大的网站中(在Apache上运行)。 - J4N
4
由于缓存很可能是您问题的显而易见的解决方案,所以我建议修改您的问题,明确指出您不想使用缓存,以避免更多关于缓存的答案。 - Curtis

1

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

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


0

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

我计划每天都有一个任务,爬取网站上特定的页面,使其更快,例如每天只爬取/新闻。

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


请您详细说明,如果可能的话,请提供一个Github仓库。目前需要这样做。 - Himanshu Pant

0

约2500个网页,它是一个官方网站,提供5种语言的法律元素。我不需要缓存。 - J4N

0

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


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