2009-12-02 101 views
0

WCF服务的SPListItem我有一个WCF服务,已使用Shail马利克指南部署到SharePoint以下方法:创建在部署到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()上执行此操作。

虽然这是踢球者,但当我通过它的代码一步一步地工作!根本没有例外!

回答

1

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

首先,肮脏的一个:

集FormDigestValidatedProperty在上下文:

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

二,略显不足脏版本(基本上为XSS攻击开放,但这是一个内部网)

The answer

0

我不认为你可以访问'list',因为它是在高位代码块之外创建的。

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

,当你正在加紧虽然整个过程中我猜是在管理模式,以便所有的升高。

+0

RunWithElevatedPriviliges只是一个试用版,整个代码块位于using语句中,该语句用SystemAccount的UserToken打开SPSIte。 – Colin 2009-12-02 11:50:49

0

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

从文章:

的HttpContext:从WCF服务 内访问时电流总是空 。

这很可能是您的问题所在。

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

+0

我已经将aspNetCompatibilityEnabled设置为true,将服务置于asp.net管道中。无论如何,我不需要一个“确切”的上下文,只需要获得一个url和系统帐号的用户口令即可。 与那些我打开一个新的SPSite。 – Colin 2009-12-02 13:29:04