我创建了一个计时器作业(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();
}
}
出于设计原因,我想将该代码放在单独类的单独方法中。所以我创建了以下类:
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();
}
}
}
}
}
实际上,我希望在计时器作业的Execute方法中调用以下代码应该以相同的结果结束。
MyClass myClassInstance = new myClass();
myClassInstance.setField();
不幸的是,我会遇到以下异常:
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:
当我把setField()方法直接放在Execute方法所在的类中时,该方法就可以正常工作了。如果我将此方法声明为静态,则会发生相同的异常。
我还尝试使用提升的权限运行发生异常的SPListItem.Update()(应该不是原因,因为代码应该在 OWSTIMER 上下文中运行)。我还尝试在 SPSite 和 SPWeb 上使用 allowUnsafeUpdates()。两者都没有成功。
在网络上,我只找到了这个问题的一个描述http://codekicker.de/fragen/sharepoint-2010-Sharepoint-2010-TimerJob-wirft-Fehler-timer(德语),不幸的是没有任何解决方案。
还有什么可能是这个星座不起作用的原因?任何想法?