从Ektron到EpiServer的内容迁移错误

时间:2015-11-07 20:53:56

标签: episerver ektron

我正在开展内容迁移项目,从Ektron 9EpiServer 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
            {

            }

但我收到此错误:Error

3 个答案:

答案 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信息。