【问题标题】:NullReferenceException when calling Sitecore Database.Templates[] inside WCF service在 WCF 服务中调用 Sitecore Database.Templates[] 时出现 NullReferenceException
【发布时间】:2013-04-01 12:09:25
【问题描述】:

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

我遇到的问题是,当我调用 Database.Template[ID template] 并传入我要处理的项目的相应模板的 ID 容器时,它在代理任务中工作,但在 WCF 服务中不起作用。

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

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

编辑 #1:我将 svc 作为允许的扩展名,并且我都尝试过

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

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

两者都返回NullReferenceException

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

【问题讨论】:

    标签: c# wcf sitecore


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回复。我实际上有私有静态 Sitecore.Data.Database DB = Sitecore.Configuration.Factory.GetDatabase("master");定义为我的服务实现的一部分,但仍然出现此错误。此外,在 web.config 中添加了 svc 作为允许的扩展名。
    • 我同意 jammykam 关于这一点的观点。如果您没有提到任何数据库引用,那么您将在他调用 GetDatabase 时得到 null!
    【解决方案2】:

    这个问题有几个部分

    • 使用 Sitecore 数据库以编程方式访问项目
    • Sitecore 安全性
    • WCF 和 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 部分中可用站点列表的名称。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 这实际上是有道理的,因为匿名用户通常不能直接访问模板。您是否尝试在 WCF 代码中添加安全禁用程序?如果您认为这是一个错误,请向Sitecore Support 提出票证。
      • 黑白 ASMX 与有什么区别。调用 Sitecore 数据库时的 WCF?
      【解决方案4】:

      还值得检查 Website\App_Config\Include\SwitchMasterToWeb.config 并在需要时重命名/删除,否则会使主数据库显示为 web。由于它是一个补丁配置,在故障排除时很容易错过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-11
        • 2014-08-24
        • 2014-08-13
        • 1970-01-01
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多