我正在开展内容迁移项目,从Ektron 9
到EpiServer 8
,第一项任务是迁移特定网页的内容,为实现这一目标,我正在关注Ektron's API
指导Ektron Developer API
1-我正在以正确的方式接近这种迁移?现在我刚刚在我的应用程序中添加了Ektron Dll作为参考。我尝试使用他们的网络服务,但它没有我需要的数据(特定网页的内容)。Ektron Web Services
这是我的代码片段:
GetAllTemplatesRequest cc = new GetAllTemplatesRequest();
//var UserCRUD = new Ektron.Cms.Framework.User.UserManager();
var UserCRUD = new UserManager();
string Token = UserCRUD.Authenticate("admin", "password");
if (!string.IsNullOrEmpty(Token)) // Success
{
try
{
//Create the Content Object set to observe permissions
Ektron.Cms.Framework.Content.ContentManager ContentAPI
= new Ektron.Cms.Framework.Content.ContentManager(ApiAccessMode.Admin);
//Retrieve the content
Ektron.Cms.ContentData contentData;
contentData = ContentAPI.GetItem(30);
//Output the retrieved item's content
var cs = contentData.Html;
}
catch (Exception _e)
{
throw _e;
}
}
else // Fail
{
}
答案 0 :(得分:0)
只需将一个来自Ektron网站的dll复制到另一个网站就行不通了。
Web服务理念更好。有通过id获取内容的Web服务调用。
或者,您可以编写自己的网络服务,该服务在ektron网站内运行,并使用Ektron API公开您想要的数据。然后从其他站点调用该服务。
答案 1 :(得分:0)
您需要查看内容迁移入门套件。 https://github.com/egandalf/ContentTransferStarterKit
答案 2 :(得分:0)
这就是我最终做的事情:
由于有许多方法可以执行迁移,因此我选择了主要关注EpiServer
API的方法来创建新的内容,块和资产;并使用Ektron
语句从SQL
获取我需要的所有内容。
Ektron将所有内容保存在名为content的表中。
页面以“文件夹结构”方式组织,因此每个页面都在“文件夹”
中要获取特定页面的文件夹ID,您可以使用此查询:
select folder_id from content where content_id = 2147485807
使用该文件夹ID,您可以获得该特定文件夹下列出的所有页面;例如,您需要获取“文章”下的所有页面。
然后我在此查询中使用了该folderID:
SELECT [content_id]
,[content_title]
,[content_html]
,[date_created]
,folder_id
,[content_teaser]
,[content_text]
,[end_date]
,[content_type]
,[template_id]
, content_status
FROM content
where folder_id=(select folder_id from content where content_id = 2147485807)
order by content_title
FOR XML PATH(‘Article’), ROOT (‘Articles’)
为我准备好在我的EpiServer
代码中使用的XML。
我在EPI服务器中做的第一件事就是在SitePageBase模型中添加一个新属性来添加一个“LegacyContentID”,它将作为映射条目,以防我需要访问/修改新创建页面的内容。它用作从Ektron导入的数据与我在EPI服务器上创建的新数据之间的链接。
[Display(
Name = “Legacy Content ID”,
Description = “Content ID from Ektron imported data , for migration purposes”,
GroupName = GroupNames.PageSettings,
Order = 37)]
[ScaffoldColumn(false)]
[Editable(false)]
public virtual string LegacyContentID { get; set; }
然后我创建了一个创建文章页面的方法,它需要的唯一参数是来自IP服务器的parentID(您可以在EpiServer中创建一个新页面,然后在该页面的属性下,您可以使用页面ID)。
public void CreateArticlesPages(int parentID)
{
IContentRepository contentRepository = ServiceLocator.Current.GetInstance<IContentRepository>();
var parentlink = new ContentReference(parentID);
XmlDocument doc = new XmlDocument();
doc.LoadXml(File.ReadAllText(@”Articles.xml”));
string jsonText = JsonConvert.SerializeXmlNode(doc);
dynamic data = JsonConvert.DeserializeObject(jsonText);
for (int i = 0; i < data.Articles.Article.Count; i++)
{
var PageImportedObject = data.Articles.Article[i];
ArticlePage page = contentRepository.GetDefault<ArticlePage>(parentlink);
page = contentRepository.GetDefault<ArticlePage>(parentlink);
page.LegacyContentID = PageImportedObject.content_id;
page.Name = PageImportedObject.content_title;
page.PageTitle = PageImportedObject.content_title;
if (PageImportedObject.content_teaser == null)
page.Summary = “No Summary from the Ektron DB”;
else
page.Summary = PageImportedObject.content_teaser;
page.Description = PageImportedObject.content_html.root.Description;
contentRepository.Save(page, EPiServer.DataAccess.SaveAction.Save, EPiServer.Security.AccessLevel.NoAccess);
contentRepository.Save(page, EPiServer.DataAccess.SaveAction.Publish, EPiServer.Security.AccessLevel.NoAccess);
}
}
上面的代码会创建一个“ArticlePage”类型的新页面,并添加之前生成的XML
内容Ektron’s
信息。