SharePoint TimerJob:在类/静态方法的实例中使用SPListItem.Update()

Mat*_*t S 5 c# sharepoint timer timer-jobs sharepoint-2010

我创建了一个计时器作业(SPJobDefintion),它已正确注册并在sharepoint 2010环境中工作.

在Timer Job 的Execute方法中,我能够使用以下代码,该代码设置特定SPListItem的字段.这很好用.

using (SPSite mySite = new SPSite(mySiteId))
{
  using (SPWeb myWeb = mySite.OpenWeb(myWebId)))
  {
    SPList myList= myWeb.Lists[myListId];
    SPListItem myItem = myList.GetItemById(myItemId);

    myItem["myField"] = myValue;
    myItem.Update();
   }
}
Run Code Online (Sandbox Code Playgroud)

出于设计原因,我想将该代码放在单独类的单独方法中.所以我创建了以下类:

namespace myNamespace
{
  class myClass
  {

    [...some stuff...]        

    public myClass()
    {
      [...more stuff...]
    }

    public void setField()
    {
      using (SPSite mySite = new SPSite(mySiteId))
      {
        using (SPWeb myWeb = mySite.OpenWeb(myWebId)))
        {
          SPList myList = myWeb.Lists[myListId];
          SPListItem myItem = myList.GetItemById(myItemId);

          myItem["myField"] = myValue;
          myItem.Update();
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

其实我希望的是,在调用这个下面的代码执行定时作业的方法应该在同样的结果.

MyClass myClassInstance = new myClass();
myClassInstance.setField();
Run Code Online (Sandbox Code Playgroud)

不幸的是,我会得到以下异常:

Microsoft.SharePoint.SPException was unhandled by user code
  Message=""
  Source=Microsoft.SharePoint
  ErrorCode=-2147418113
  NativeErrorMessage=FAILED hr detected (hr = 0x8000ffff)

  NativeStackTrace=""
  StackTrace:
       bei Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)
       bei Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, [...])
       bei Microsoft.SharePoint.SPListItem.AddOrUpdateItem(Boolean bAdd, Boolean bSystem, [...])
       bei Microsoft.SharePoint.SPListItem.UpdateInternal(Boolean bSystem, [...])
       bei Microsoft.SharePoint.SPListItem.Update()
       bei myNamespace.myClass.<>c__DisplayClass1.<setField>b__0()
   InnerException: System.Runtime.InteropServices.COMException
       Message=<nativehr>0x8000ffff</nativehr><nativestack></nativestack>
       Source=""
       ErrorCode=-2147418113
       StackTrace:
            bei Microsoft.SharePoint.Library.SPRequestInternalClass.AddOrUpdateItem(String bstrUrl, [...])
            bei Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, [...])
       InnerException: 
Run Code Online (Sandbox Code Playgroud)

当我把setField()直接方法的类,其中执行方法,该方法将正常工作.如果我将此方法声明为static,则会发生相同的Exception.

我也试着运行SPListItem.Update() ,在发生异常时,以高特权(应该不是这个原因,因为代码应在OWSTIMER上下文中运行).我也试着玩的allowUnsafeUpdates()上的SPSite和的SPWeb.两者都没有成功.

在网上我发现这个问题只有一个描述http://codekicker.de/fragen/sharepoint-2010-Sharepoint-2010-TimerJob-wirft-Fehler-timer(德语),遗憾的是没有任何解决方案.

还有什么可能是因为这个星座不起作用?任何的想法?

小智 2

它肯定需要 myWeb.AllowUnsafeUpdates = true; 在更新任何列表项之前。更新后不要忘记将其重置回 false。

我要确保的一件事是确保运行代码的用户拥有更新项目的完全权限。我建议以站点管理员身​​份登录并尝试从按钮单击事件(而不是计时器作业)或其他一些事件运行代码,以确保这不是用户权限问题。

谢谢

森蒂尔S