我是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
。
答案 0 :(得分:8)
您的WCF服务没有Sitecore上下文,因此Sitecore.Context.Database
为空。
您可以将svc
添加到允许的扩展程序列表中,也可以通过Sitecore.Configuration.Factory.GetDatabase("master")
答案 1 :(得分:2)
这个问题有几个部分
使用Sitecore数据库以编程方式访问项目
Sitecore.Configuration.Factory.GetDatabase(Database)
将获得数据库,但这会带来第2号问题。Sitecore.Context.ContentDatabase
或Sitecore.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:
Sitecore.Context.ContentDatabase
或Sitecore.Context.Database
,则可能会从数据库中获取空异常,尤其是在CD实例上运行服务时。 Sitecore.Context.SetActiveSite(SiteName)
设置活动站点。答案 2 :(得分:0)
这不是一个理想的解决方案,但我将这几乎线路从WCF服务转换为基于ASMX的服务,一切运行良好。我遇到的唯一问题是,在调用服务时我遇到了访问权限问题。
我将ASMX服务功能内容包装在这种类型的块中:
using (new Sitecore.SecurityModel.SecurityDisabler()) { }
一切都神奇地开始起作用了。我开始怀疑这不是我遇到的Sitecore框架的错误。如果有人知道如何提交正式报告,请告诉我。
答案 3 :(得分:0)
还值得检查Website \ App_Config \ Include \ SwitchMasterToWeb.config并根据需要重命名/删除,因为它会使master数据库显示为web。作为补丁配置,在进行故障排除时很容易错过。