【问题标题】:Access Sitecore items via .NET web service通过 .NET Web 服务访问 Sitecore 项目
【发布时间】:2010-07-30 17:28:34
【问题描述】:

有没有人幸运地使用 .NET Web 服务访问 Sitecore 项目?我的服务器上有许多仍在 Coldfusion 中的 Web 应用程序。我希望能够调用 Web 服务来下拉项目,但是当我尝试这样做时,出现异常“Sitecore.Data.Items.Item 无法序列化,因为它没有无参数的构造函数。”

【问题讨论】:

  • 我不确定这是否可能。 Sitecore.Data.Items.Item 是一个非常健壮的(阅读:填充了执行更多 Sitecore DAL 调用的方法)类,并且实际上不适合从 Web 服务返回。你为什么做这个?或许有更简单的实现方式?
  • 我绝对愿意接受更简单的事情。基本上,我在 Sitecore 中有许多需要在 Coldfusion 应用程序中显示的内容项。在我的特定实例中,我的所有新闻文章都在 Sitecore 中,但有许多 Coldfusion 应用程序以一种方式形成或形成新闻项目。
  • 提供了很多选项来回答这个问题,但没有足够清晰的反馈给这个人一个好的答案。
  • 不过,这并不是对这个问题投反对票的好理由,只是因为你对我没有接受你的回答感到不安。我还没有找到任何对我有用的东西,我不得不继续前进,因为我不能永远停留在这上面。我考虑关闭问题,但选择将其保持打开状态,因为这里的信息可能会帮助其他人。

标签: .net web-services sitecore


【解决方案1】:

查看 Sitecore 标准 Web 服务,您可以在解决方案的 /sitecore/shell/WebService 文件夹下找到它。它提供了一些有关 Sitecore 项目和字段的基本操作,但通常足以提取或保存数据。

希望这会有所帮助。

【讨论】:

  • 感谢您的提示。我想我基本上已经得出结论,这是不可能的。
  • 您能进一步解释为什么标准服务不适合您吗?根据您在这里所说的一切,这听起来像是最好的解决方案
  • 我确信它会以某种方式工作。这里的关键是我希望能够重用我已经编写的方法来检索在我的一个站点核心页面上的 Web 控件内部使用的一组特定项目。基本上我不希望有两段不同的代码来维护它们做本质上相同的事情。
【解决方案2】:

我也在SDN forum 上回答了这个问题。您可以创建自己的包装对象,该对象填充 Sitecore 项目并设置其成员。困难的部分是创建您的成员并从真正的 Sitecore 项目中分配他们。如果你想要一切,那么我认为这将是困难的。如果你只是想要一些东西,那么它是可行的。例如

[Serializable]
public class SitecoreItem {
  public string ID;
  // more members

  SitecoreItem(Sitecore.Data.Items.Item scItem) {
      this.ID = scItem.ID;
      // assign more members from the true Sitecore item
  }

}

然后在您的 WS 方法中用您的实际 Sitecore 项目填充一个新实例并返回它:

return new SitecoreItem(actualSCItem);

【讨论】:

  • 谢谢,这是有道理的。关于如何使其更通用的任何想法?我想要一些可用于任何项目以返回所有字段的东西。我知道你说过这会更困难,但你对如何开始做这件事有什么想法吗?
  • 您无法序列化 Sitecore.Data.Items.Item 类,因此您唯一的方法是创建一个包装器并完成分配成员的工作。如果您花时间浏览所有属性,则此解决方案是通用的。唯一的其他选择是使用提到的内置 WS Yan
  • Fields类可以序列化吗?这对我来说是关键。我需要获取所有字段信息,而不是每个模板都包含相同的字段。
  • 嗯,这很好。我猜你不能,因为可以存在许多类型的实际字段,你需要序列化它们及其属性。 Fields 属性是 Sitecore.Collections.FieldCollection,因此您还需要对其进行序列化。
【解决方案3】:

如果序列化器和反序列化器都可以访问 Sitecore 数据库,那么您可以非常轻松地创建一个仅序列化 ID、数据库名称、版本和语言的包装器。然后在另一端进行反序列化后,您可以使用该信息从数据库中重新获取相同的 Sitecore 项目。

如果反序列化器根本无法访问数据库,那么这实际上取决于您对使用数据的需求。我通常会遍历所有字段(请记住首先使用item.Fields.ReadAll()),并将它们存储在字典中以便于访问。对于序列化,我将其转换为键值对的List<T> 并忽略Dictionary 成员(因为它无法序列化),然后在反序列化时重新填充它。我还在类中保留了一些其他属性,例如 ID、语言、版本、模板、路径等。

或者,如果您创建一个完整的模型类库,以便将每个模板映射到一个类(有些人这样做),您可以(可能)直接序列化它们,因为它们(可能)不再绑定到 Sitecore项目。

【讨论】:

  • 整个类库的事情正是我们所做的。每个模板都有一个类,每个字段都映射到一个属性。我们在 Sitecore 中制作了一个工具来自动构建这些。我推荐这种方法,但前提是你可以自动化它。如果不是,那么这就像为 Sitecore 项目的每个成员创建包装器一样乏味。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2011-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多