【问题标题】:Generate Static HTML Pages to replace dynamic pages生成静态 HTML 页面以替换动态页面
【发布时间】:2012-07-08 03:05:49
【问题描述】:

对于一个项目,我们必须生成静态 .html 页面,这些页面将发布在同一台服务器上,为数百万访问者提供服务。

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

该项目已经使用 C# asp.net MVC3 开发,我们需要将动态生成的页面存储在同一个 url 上的 .html 中以提供给访问者。

我想知道如何使用 asp.net MVC3/Razor 来生成那些 .html 页面?

我不想/不需要使用网络缓存,由于很多原因(负载(每天加载数百万页),这些静态页面将被缓存在 CDN 网络上以进一步超快速服务,而无需原始服务器进入图片,页面数量真的太多了(缓存只会在我有很多时间相同的页面时对我有帮助,但是我会经常访问超过一百万个页面,所以我必须经常生成它们。)

所以我真的会搜索一些东西来生成 HTML 页面。

任何想法如何做到这一点......

【问题讨论】:

  • 你说你不想缓存......在下一句中,你说这正是你要做的。
  • 我们已经在使用缓存并且它运行良好,但是与我们目前拥有的相比,我们预期的网站流量非常非常高,存储 html 是最简单的扩展方式,否则我们可能会最终实现了网络农场、memcached 和所有这些技术来支持网络流量。也使应用程序更复杂以支持分布式缓存和会话等。与它们相比,存储 html 很容易,它们可以在 CDN 上缓存为很好地释放了我们的主服务器。

标签: asp.net asp.net-mvc-3 performance razor


【解决方案1】:

首先,确保您的路由都生成可以复制为静态 html 文件的 url。这样您对 Html.ActionLink 的调用就会生成您可以使用的网址。

像直接使用它一样生成整个站点,然后让它在外部缓存

您可以在 Linux 上使用 wget 之类的工具来获取站点的整个 html 树,并将它们与内容文件一起放置; css、图片、javascript等

然后在有变化时重新下载网站。

【讨论】:

  • 如何生成和存储?
  • 你回答的前半部分正是我的想法。我很想有一种方法来使用 ASP.Net/MVC/Razor 来创建一个静态 html 站点,但是有一个基本问题是 MVC 会为您提供不适用于静态站点的 URL,因此您必须修改所有内部链接以使用页面而不是路由。在构建路由时必须非常小心,以使 URL 在转换为页面时正常工作。当然,除了可能的客户端解析之外,您需要避免使用任何使用查询字符串的 URL。我很想看到 .Net 版本的 DocPad。
【解决方案2】:

在我的公司,我们也做过类似的事情。我们有一个单独的程序,它通过一个 url 列表,向它们发送一个 http-request。保存结果并将其复制到 Web 服务器。这样,我们在网络内部只有一个带有 asp 代码的 Web 服务器,并且 Internet 上的服务器具有动态页面的静态副本。我们从中获得了一些出色的表现。

为了让您获得 url 列表,您可能必须创建一个特殊的视图/控制器来查询数据库中可用于查询所需信息的键。因此,例如,如果您有一个显示汉堡包的网站,则创建 url 的列表视图可能会查询您的 burger-table 并创建一堆 /myburger?name=Wopper 类型的 url。然后您的批处理程序读取这些 url 并如前所述,执行 http 请求并保存结果等。

【讨论】:

  • 您能告诉我们,如何首先使用 c# 为基于 c# mvc3 构建的网站生成 html 吗?
  • 为了获得 html,您只需要一个使用 System.Net.WebClient 的程序,然后运行 ​​DownloadString 方法。诀窍是找出您要下载的网址。也许使用站点地图是一个好的开始。 github.com/maartenba/MvcSiteMapProvider
  • 我正在寻找在第一次访问 html 时生成和存储 html 的可能性,然后从 html 提供所有后续访问。并让 html 在 24 小时后过期,然后它会自动重新生成它。
【解决方案3】:

如果你想基于 mvc 视图和模型生成 html,你可以使用 Razor。 我已经使用它来生成电子邮件模板,我们使用 Razor 将模型注入到视图中。如果符合您的目的,您可以从视图生成 html 并将它们写入静态 html 文件。 参考 NuGet 的 Razor Engine,你可以像使用它一样使用它

var html = Razor.Parse(templateView, model);

如果您想对其进行更多自定义,本教程可能会对您有所帮助。 http://www.west-wind.com/weblog/posts/2012/May/30/Rendering-ASPNET-MVC-Views-to-String

【讨论】:

  • 您好约瑟夫,谢谢您的回答。该站点已经在使用 Razor Engine。我会调查这个。谢谢
【解决方案4】:

我总是使用我自己的电子邮件生成方法而不是 MvcMailer。 首先,您应该从您的视图或部分生成一个字符串,然后添加/删除一些html标签,例如<html>等,如果您需要...接下来将此字符串写入文件,将其保存为.html文件到你的路。

public static string HTMLToString(ControllerContext context, string viewName, object model)
{
    if (string.IsNullOrEmpty(viewName))
        viewName = context.RouteData.GetRequiredString("action");

    var viewData = new ViewDataDictionary(model);

    using (var sw = new StringWriter())
    {
        var viewResult = ViewEngines.Engines.FindPartialView(context, viewName);
        var viewContext = new ViewContext(context, viewResult.View, viewData, new TempDataDictionary(), sw);
        viewResult.View.Render(viewContext, sw);

        return sw.GetStringBuilder().ToString();
    }
}

【讨论】:

    猜你喜欢
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 2020-09-29
    • 1970-01-01
    • 2015-02-20
    • 1970-01-01
    • 2012-06-26
    相关资源
    最近更新 更多