【问题标题】:Creating an SPListItem in a WCF service deployed to SharePoint在部署到 SharePoint 的 WCF 服务中创建 SPListItem
【发布时间】:2009-12-02 11:14:43
【问题描述】:

我在 WCF 服务中有以下方法,已使用 Shail Malik 的指南部署到 SharePoint:

[OperationContract]
public string AddItem(string itemTitle, Guid? idOfListToUse)
{
  using (var portal = new SPSite(SPContext.Current.Site.Url, SPContext.Current.Site.SystemAccount.UserToken))
  {
    using (var web = portal.OpenWeb())
    {          
      Guid listId;

      web.AllowUnsafeUpdates = true;

      if (idOfListToUse != null && idOfListToUse.Value != new Guid())
      {
        listId = idOfListToUse.Value;
      }
      else
      {
        try
        {
          listId = new Guid(web.Properties[PropertyBagKeys.TagsList]);
        }
        catch (Exception ex)
        {
          throw new MyException("No List Id for the tag list (default list) has been found!", ex);
        }
      }

      var list = web.Lists[listId];

      string title = "";

      SPSecurity.RunWithElevatedPrivileges(delegate{
        var newItem = list.Items.Add();
        newItem["Title"] = itemTitle;
        newItem.Update();
        title = newItem.Title;
      });

      web.AllowUnsafeUpdates = false;

      return title;
    }
  }
}

当从 Javascript 调用该方法时(使用 Rick Strahl 出色的 ServiceProxy.js),它会失败,并且由于 ValidateFormDigest() 而在 newItem.Update() 上执行此操作。

这就是关键,当我单步执行代码时,它就可以工作了!没有例外!

【问题讨论】:

    标签: wcf security sharepoint service


    【解决方案1】:

    好的,找到答案了(甚至有 2 个 :-D)

    首先,肮脏的:

    在上下文中设置 FormDigestValidatedProperty:

    HttpContext.Current.Items["FormDigestValidated"] = true;
    

    其次,稍微不那么脏的版本(基本上为 XSS 攻击留出了余地,但无论如何这是一个内网)

    The answer

    【讨论】:

      【解决方案2】:

      我认为您无法访问“列表”,因为它是在提升的代码块之外创建的。

      http://blogs.pointbridge.com/Blogs/herzog_daniel/Pages/Post.aspx?_ID=8

      我猜你是在单步执行时,但整个过程都处于管理员模式,所以所有过程都被提升了。

      【讨论】:

      • RunWithElevatedPriviliges 只是一个试用版,整个代码块都在使用 SystemAccount 的 UserToken 打开 SPSite 的 using 语句中。
      【解决方案3】:

      Colin,尝试访问 WCF 服务中的 HttpContext(同样是 SPContext)是一个非常糟糕的主意。见这里:MSDN: WCF Services and ASP.NET

      来自文章:

      HttpContext:当前始终为空 从 WCF 中访问时 服务。

      这很可能是您的问题的原因。

      编辑:我注意到您正在尝试使用 SPContext 来获取网站集的 url。我也没有找到一个好的解决方案,所以我只是将目标网站集的 url 作为参数发送给服务调用。不是最佳解决方案,但我想不出更好的方法。此外,如果您需要检查身份验证/身份等,请使用ServiceSecurityContext.Current

      【讨论】:

      • 我已将 aspNetCompatibilityEnabled 设置为 true,这会将服务置于 asp.net 管道中。无论如何,我不需要“确切”上下文,只需要获取 url 和系统帐户的用户令牌即可。有了这些,我打开了一个新的 SPSite。
      猜你喜欢
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多