2010-07-30 47 views
6

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

+1

我不确定这是可能的。一个Sitecore.Data.Items.Item是一个非常健壮的(阅读:充满了做更多的Sitecore DAL调用的方法)类,真的不适合从Web服务返回。你为什么做这个?也许有一个更简单的实现? – EliThompson 2010-07-30 18:58:54

+0

我对一些简单的东西绝对开放。基本上,我在Sitecore中有许多内容项目需要在Coldfusion应用程序中显示。在我的特殊情况下,我在Sitecore中拥有所有的新闻文章,但是有一些Coldfusion应用程序以某种形式或形式吸引新闻项目。 – Kyle 2010-07-30 20:24:30

+0

提供了很多选项来回答这个问题,但没有给出足够清晰的反馈给这个男人一个很好的答案。 – techphoria414 2010-09-06 04:43:11

回答

7

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

希望这会有所帮助。

+2

感谢您的提示。我想我基本上已经断定这不能做到。 – Kyle 2010-08-02 20:31:19

+0

你能否进一步解释为什么标准服务不适合你?基于你在这里说的一切,这听起来像是最好的解决方案 – techphoria414 2010-08-10 21:45:09

+1

我相信它会以某种方式工作。这里的关键是我希望能够重用已经编写的方法来检索在我的一个sitecore页面上的Web控件内部使用的特定项目集合。基本上我不想有两个不同的代码片段来维护它们,基本上都是一样的。 – Kyle 2010-08-11 17:26:56

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); 
+0

谢谢,这是有道理的。有关如何使它更通用的想法?我想有一些东西可以用于任何项目以返回所有字段。我意识到你说这会更困难,但是你有什么想法可以开始讨论这个问题吗? – Kyle 2010-08-05 13:09:05

+0

你不能序列化Sitecore.Data.Items.Item类,所以你唯一的办法就是创建一个包装器并完成分配成员的工作。如果你花时间去浏览所有的属性,这个解决方案是通用的。唯一的其他选择是使用内置的WS Yan提到 – 2010-08-05 14:50:12

+0

字段类可以序列化吗?这将是我的关键。我需要获取所有的字段信息,而不是每个模板都包含相同的字段。 – Kyle 2010-08-05 15:33:03

1

如果这两个串行器及解串器可以访问Sitecore的数据库,那么你可以很轻松创建一个只包含ID,数据库名称,版本和语言的封装器。然后在另一端进行反序列化时,可以使用该信息从数据库中重新获取相同的Sitecore项目。

如果反序列化器根本无法访问数据库,那么它确实取决于您对使用数据的需求。我通常会遍历所有字段(请先记住使用item.Fields.ReadAll()),并将它们存储在字典中以便于访问。对于序列化,我将其转换为键值对的List<T>,并忽略Dictionary成员(因为它不能被序列化),然后在反序列化中重新填充它。我还在课堂上保留了一些其他属性,如ID,语言,版本,模板,路径等。如果你创建一个完整的模型类库,以便每个模板都映射到一个类(有些人可以),你可以(可能)直接将它们序列化,因为它们可能(可能)不再绑定到Sitecore项目。

+0

整个类库的东西正是我们所做的。每个模板都有一个类,每个字段都映射到一个属性。我们在Sitecore中创建了一个工具来自动构建这些工具。我建议这种方法,但前提是你可以自动化。如果没有,那么就像为Sitecore项目的每个成员创建包装一样繁琐。 – 2010-08-05 18:10:35