如何为现有 ASP.NET 网站添加内容管理
用现代化的内容管理功能增强您旧的 ASP.NET 网站
引言
我一直在寻找一个内容管理系统来驱动我旧的 ASP.NET 网站。我没想到找到一个像样的会如此困难,但事实确实如此。所以我决定研究这个问题并在这里分享我的经验。
事实上,出于某种原因,几乎所有的 CMS 供应商都认为我急于从头开始重建我的网站。广告着重于 CMS 的安装简便性和丰富的功能。但在描述如何将现有内容迁移到新系统时,广告变得含糊不清,并且大多忽略了我网站的所有业务功能和我当前拥有的所有专有代码。
在 21 世纪的第二个十年,这种做法显得不够妥当。如今,公司的网站不仅仅是文本和图片,它还在进行业务。它已经经过了多次重建,充斥着独特的代码和业务功能。声称可以将业务网站轻松迁移到某个预打包的 CMS 中,这并非准确的评估。
内容管理只是现代网站的众多功能之一。为了获得这一功能而放弃所有其他重要功能是不合理的。为什么我们不能在不牺牲网站业务目的的情况下,简单地将内容管理功能添加到现有网站中?
CMS 作为网站基础的整个理念已经过时。技术早已超越了需要一次又一次从头构建一切的阶段。现代系统可以发展,我们的网站也应该随之发展。
因此,以下是难以找到可用于增强现有网站的 CMS 的原因:
1. 丢弃一个已经满足其业务目的的网站是不切实际的。
2. 业务不断发展,很难预测明天将需要哪些 CMS 功能。CMS 供应商锁定可能会强加不必要的功能,并剥夺业务未来可能需要的功能。
3. IT 部门不愿在他们已经人满为患的服务器机房中安装另一个软件。IT 部门希望按照自己的方式构建 IT 系统,而不是 CMS 供应商强制的方式。
4. 我们确实想保留现有的网站。我们希望在需要时能够添加内容管理功能,而无需破坏整个系统。
要求
那么,我所寻找的技术奇迹是什么样的呢?
我花了一段时间才认识到需求
1. 拖放。也许不是字面意义上的,但想法是一样的——我应该能够在不干扰网站所有其他功能的情况下,将内容管理功能添加到网页中。
2. à la carte 功能。我应该能够在需要时将新功能添加到现有网站中。
3. 配置优于编程。我应该能够通过配置来应对大多数情况。编程应该是最后的手段。
4. 无需安装软件。我可以容忍少量我应该放到服务器上的软件,但大部分系统应该驻留在别处。如果这听起来像基于云的解决方案,那很可能是。
5. 选择。我希望一切都按照我的方式进行。系统应该适应我拥有的任何 IT 环境,应该适应我网站当前的工作方式。
尽管这些需求听起来可能很极端,但它们实际上是对进化的致敬——如今技术可以承受进化式的方式。简而言之,不要替换您现有的网站,而是升级它。
为网站添加内容的几种方法
正如您可能猜到的,大多数现有的内容管理系统无法完全满足我的梦想。但有一些方法可以非常接近期望的结果。
两种基本选择
a) 将任何知名的 CMS 与旧网站并排安装,并编写代码以在运行时某种程度上将内容从 CMS 传输到网站;
b) 使用专为将托管内容注入现有网站而设计的解决方案。
您选择哪种解决方案取决于您如何优先考虑需求,尤其是您愿意容忍多少编程和多少对现有网站的干预。
并行前端集成
这可能是最明显的方法——部署一个由您选择的 CMS 驱动的新网站,并使用 IFRAME 或 JavaScript 代码在您的旧网站上显示其页面。
更新 [2012 年 5 月 8 日]: 正如一些读者指出的那样,在大多数情况下,通过 IFRAME 或 AJAX 进行集成在搜索引擎优化方面并不是一个好主意。IFRAME 集成还需要仔细关注托管文本中的所有链接,因为这些链接应指向父框架以更新整个页面,而不仅仅是 IFRAME 内容。对于真实的业务网站,ElasticWCM 等专业解决方案(见下文)将是首选。在这些解决方案中,基于云的系统提供所有内容管理功能、版本控制、权限——将多个内容字段注入网页上的指定区域,并用适当的语言显示,有时根据发布计划。专业系统很难被超越,尤其是当它们免费时
通过 IFRAME 连接
在这里,您将页面的一部分替换为 IFRAME,您将在其中显示新 CMS 的内容。
如果旧网站上有这样的页面
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My Page on old web site</title>
</head>
<body>
<div>...site header here...</div>
<h1>Page Title</h1>
<img alt="my picture" src="picture.jpg" />
<p>Some text...</p>
<div>...site footer here...</div>
</body>
</html>
您将更改它以包含一个引用新 CMS 上页面的 iframe
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<div>...site header here...</div>
<title>My Page on old web site</title>
</head>
<body>
<iframe src="[New CMS page URL goes here]" width="900" height="600" frameborder="0"></iframe>
<div>...site footer here...</div>
</body>
</html>
您应该更改 iframe 的大小以匹配您的网站设计。
通过 JavaScript 连接
jQuery 使从不同页面加载内容变得非常容易。
步骤
1. 在 CMS 页面上,识别或创建一个包含托管内容的 HTML 元素(最可能是 DIV),它将是数据源。假设其 ID 为“content”。
2. 在旧网站的内容页面上,定义一个将保存托管内容的 DIV,为其分配一个 ID,例如“container”。
3. 添加 JavaScript 代码,从 CMS 页面的“content” DIV 中检索 HTML,并用它填充网站页面的“container” div。
$(function() {
$('# container').load('cmsPageUrl #content');
});
许多内容管理系统会为页面内容创建 RSS feed,这是另一种选择——您可以使用 JavaScript 查询该 RSS。jFeed https://github.com/jfhovinne/jFeed - 一个 jQuery RSS/Atom 插件使其变得容易。
请注意,在上述两种情况下,您的 CMS 也会被互联网用户访问,如果他们能找到指向它的 URL。如果您不希望这样,您可能应该考虑后端集成,在那里您可以将 CMS 对公众隐藏。
并行后端集成
此解决方案的技术细节在很大程度上取决于您将使用的 CMS 类型。
一个相当复杂的解决方案示例是与 MS SharePoint Foundation 集成。
您可以将 SharePoint 用作后端存储,并提供丰富的 HTML 编辑器、高级权限管理和协作功能。
步骤
1. 安装 SharePoint Foundation 2010(从 Microsoft 网站免费下载:http://www.microsoft.com/en-us/download/details.aspx?id=5970)
2. 创建新的 SharePoint 场,然后创建新的 Web 应用程序和站点集,并在根目录下创建一个空白站点。
3. 在根站点中创建一个自定义列表,称之为“MyPages”。在该列表中,Title 字段将保存您将在查询中用于标识页面的页面名称。
4. 在您的自定义列表中,定义一个新的 HTML 文本字段,它将保存您页面的内容。将该字段命名为“PageHtml”。
5. 在旧网站的项目中的某个地方创建一个函数,用于检索 PageHtml 字段的值。
public class MyContent
{
public static SPListItem GetPageItem(string pageName)
{
using (SPSite site = new SPSite("http://mySpSiteUrl"))
{
using (SPWeb web = site.OpenWeb())
{
string listUrl = web.ServerRelativeUrl + "/lists/MyPages";
SPList list = web.GetList(listUrl);
SPQuery query = new SPQuery();
query.Query = string.Format("<Where><Eq><FieldRef
Name='Title'/><Value Type='Text'>{0}</Value></Eq></Where>", pageName);
query.ViewFields = "<FieldRef Name='Title' /><FieldRef Name='PageHtml' />";
SPListItemCollection items = list.GetItems(query);
if (items != null && items.Count > 0)
{
return items[0];
}
}
}
return null;
}
}
现在,在您的旧 ASP.NET 网站的任何页面上,您都可以调用此函数来检索页面 HTML 并显示它,而不是硬编码的内容。SharePoint 站点将为您提供所有内容管理功能。
使用专业系统
市面上有几个系统旨在更新现有网站。
一种方法是将第三方 CMS 连接到后端存储,并让它在后台更新网站文件。这里的例子:CushyCMS 和 Instant Update CMS。这是一种相当不成熟的方法,剥夺了现代内容管理系统必须具备的许多功能。此外,直接更改站点的源文件很可能会违反大多数公司的软件部署流程。
随着基于云的解决方案的普及,新型内容管理系统开始出现。这些系统与您的网站建立连接,将内容数据库保留在云中,并通过封装良好的内容控件在运行时将内容注入网页。
ElasticWCM http://www.elasticwcm.com 是一个很好的例子。从开发者的角度来看,ElasticWCM 只是一个包含在单个 DLL 中的免费 ASP.NET 控件集。将这些控件放置在网页上,即可将 ASP.NET 网站转换为多语言内容管理系统,而无需编写任何代码。而且因为它是免费的,任何人都可以尝试它,看看它是否适用于特定的解决方案。
关注点
可以关注的一个地方是 Windows Azure Marketplace。那里有一些免费的解决方案可能有助于您为网站添加有用的功能。