在WCF服务中调用Sitecore Database.Templates []时出现NullReferenceException

时间:2013-04-01 12:09:26

标签: c# wcf sitecore

我是Sitecore开发的新手,所以如果这个问题是基本的,我很抱歉。我创建了一个代理(计划任务)和一个WCF服务,并将它们都添加到我的SiteCore项目中。代理调用WCF服务代码调用的相同代码。

我遇到的问题是,当我调用Database.Template[ID template]传递我想要处理的项目的相应模板的ID容器时,它在代理任务内部工作,但不在WCF服务内部。< / p>

在WCF服务中对Database.Template[ID id]的任何调用都给了我NullReferenceException,但是代理内部完全相同的调用正确地收集了模板。

这是否是由于某些结构性原因依赖于调用应用程序是网页而不是网络服务?

编辑#1:我有svc作为允许的扩展,我已经尝试了两个

Sitecore.Configuration.Factory.GetDatabase("master") 

var siteContext = Sitecore.Configuration.Factory.GetSite("websiteMaster");
siteContext.Database.Template[]; 

返回NullReferenceException

我也可以使用GetItem成功获取一个项目,但是当我尝试访问该项目的Template属性时,我得到一个NullReferenceException

4 个答案:

答案 0 :(得分:8)

您的WCF服务没有Sitecore上下文,因此Sitecore.Context.Database为空。

您可以将svc添加到允许的扩展程序列表中,也可以通过Sitecore.Configuration.Factory.GetDatabase("master")

获取数据

答案 1 :(得分:2)

这个问题有几个部分

  • 使用Sitecore数据库以编程方式访问项目
  • Sitecore安全
  • WCF&amp; Sitecore HTTPContext

使用Sitecore数据库以编程方式访问项目

  • 创建用于阅读/编辑Sitecore项目的WCF服务需要访问Sitecore数据库,请参阅Programmatically Login into Sitecore
  • (正如已经提到的),明确地使用Sitecore.Configuration.Factory.GetDatabase(Database)将获得数据库,但这会带来第2号问题。
  • 要利用内置的Sitecore功能,使用Sitecore.Context.ContentDatabaseSitecore.Context.Database方法根据请求的上下文返回正确的数据库会更灵活; CD,CM服务器等。

安全

  • 虽然安全禁用程序可以解决访问Sitecore数据库的所有安全问题,但不建议这样做。 Alex Soft and Sitecore Security

    using (new SC.Security.Accounts.UserSwitcher(User.FromName(ServiceAccountName, true)))
    {
        // code here
    }
    

更恰当地与Sitecore's Security API对齐,提供事务的安全跟踪,​​并支持对服务完成的已更改项目进行版本控制。此类信息将有助于错误跟踪和审计。

WCF和Sitecore HTTPContext:

  • 使用WCF和使用Sitecore HTTPContext的对象可能会遇到问题。
  • 如果要在WCF服务中使用Sitecore.Context.ContentDatabaseSitecore.Context.Database,则可能会从数据库中获取空异常,尤其是在CD实例上运行服务时。
  • 克服此限制的一个班轮金蛋是在服务的某个时刻(通常是构造函数)使用Sitecore.Context.SetActiveSite(SiteName)设置活动站点。
  • SiteName是web.config的Sitecore / Sites部分中可用站点列表的名称。

答案 2 :(得分:0)

这不是一个理想的解决方案,但我将这几乎线路从WCF服务转换为基于ASMX的服务,一切运行良好。我遇到的唯一问题是,在调用服务时我遇到了访问权限问题。

我将ASMX服务功能内容包装在这种类型的块中:

using (new Sitecore.SecurityModel.SecurityDisabler()) { }

一切都神奇地开始起作用了。我开始怀疑这不是我遇到的Sitecore框架的错误。如果有人知道如何提交正式报告,请告诉我。

答案 3 :(得分:0)

还值得检查Website \ App_Config \ Include \ SwitchMasterToWeb.config并根据需要重命名/删除,因为它会使master数据库显示为web。作为补丁配置,在进行故障排除时很容易错过。