Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过.NET web服务访问Sitecore项目_.net_Web Services_Sitecore - Fatal编程技术网

通过.NET web服务访问Sitecore项目

通过.NET web服务访问Sitecore项目,.net,web-services,sitecore,.net,Web Services,Sitecore,有没有人有幸使用.NETWeb服务访问Sitecore项目?我的服务器上有许多web应用程序仍处于Coldfusion中。我希望能够调用web服务来下拉项目,但当我尝试这样做时,出现了一个异常“Sitecore.Data.items.Item无法序列化,因为它没有无参数构造函数。”查看Sitecore标准web服务,您可以在解决方案的/Sitecore/shell/WebService文件夹下找到它。它提供了一些有关Sitecore项和字段的基本操作,但通常足以提取或保存数据 希望这有帮助。我也

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

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

希望这有帮助。

我也在网上回答了这个问题。您可以创建自己的包装器对象,该对象由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-method中,使用实际的Sitecore项目填充一个新实例并返回它:

return new SitecoreItem(actualSCItem);

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

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


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

我不确定这是否可行。Sitecore.Data.Items.Item是一个非常健壮的类(读:填充了执行更多Sitecore DAL调用的方法),不适合从web服务返回。你为什么这么做?也许有一个更简单的实现?我肯定会接受更简单的东西。基本上,我在Sitecore中有许多需要在Coldfusion应用程序中显示的内容项。在我的例子中,我的所有新闻文章都在Sitecore中,但有许多Coldfusion应用程序以某种形式拉取新闻项目。有很多选项可以回答这个问题,但没有足够清晰的反馈给这个人一个好的答案。不过,这并不是否决这个问题的好理由,只是因为我没有接受你的回答,你很难过。我还没有找到任何适合我的东西,我不得不继续前进,因为我不能永远停留在这上面。我曾考虑结束这个问题,但还是选择了不回答,因为这里的信息可能会帮助其他人。谢谢你的提示。我想我基本上已经得出结论,这是不可能做到的。你能进一步解释一下为什么标准服务对你不起作用吗?根据你在这里所说的一切,这听起来是最好的解决方案,我相信它会在某种程度上起作用。这里的关键是,我希望能够重用我已经编写的方法,以检索在我的一个sitecore页面上的web控件内部使用的特定项集。基本上,我不希望有两段不同的代码来维护,它们做的基本上是相同的事情。谢谢,这是有意义的。但是,关于如何使它更通用,有什么想法吗?我想有一些东西,我可以使用任何项目返回所有字段。我知道您说过这会更困难,但是您对如何开始这项工作有什么想法吗?您无法序列化Sitecore.Data.Items.Item类,因此您唯一的方法是创建包装器并分配成员。不过,如果您花时间查看所有属性,则此解决方案是通用的。唯一的另一个选择是使用内置的WS-Yan。Fields类可以序列化吗?这是我的钥匙。我需要得到所有的字段信息,不是每个模板都包含相同的字段。嗯,这是一个很好的观点。我猜你不能,因为有很多类型的实际字段可以存在,你需要序列化这些字段及其属性。
Fields
属性是一个
Sitecore.Collections.FieldCollection
,因此您也需要序列化它。整个类库就是我们所做的。每个模板都有一个类,每个字段都映射到一个属性。我们在Sitecore中制作了一个工具来自动构建这些。我建议您采用这种方法,但前提是您可以将其自动化。如果没有,那么这就像为Sitecore项目的每个成员创建包装器一样繁琐。