3

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

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

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

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

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

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

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

4

4 回答 4

2

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

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

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

然后在有更改时重新下载该站点。

于 2012-07-08T11:45:58.580 回答
2

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

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

于 2012-07-08T11:47:03.107 回答
1

如果要基于 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

于 2012-07-09T05:26:20.330 回答
0

我总是使用自己的电子邮件生成方法而不是 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();
    }
}
于 2017-03-23T23:57:07.983 回答