![](/img/trans.png)
[英]SPListItem.Update throws UnauthorizedAccessException for Forms authenticated user
[英]SharePoint TimerJob: Using SPListItem.Update() in an instance of a class / static method
我創建了一個計時器作業( 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方法所在的類中時,該方法將正常工作。 如果我將此方法聲明為static,則會發生相同的Exception。
我還嘗試使用提升的權限運行發生異常的SPListItem.Update() (應該不是原因,因為代碼應該在OWSTIMER上下文中運行)。 我還嘗試在SPSite和SPWeb上使用allowUnsafeUpdates()。 兩者都沒有成功。
在網上我發現這個問題只有一個描述http://codekicker.de/fragen/sharepoint-2010-Sharepoint-2010-TimerJob-wirft-Fehler-timer (德語),遺憾的是沒有任何解決方案。
還有什么可能是因為這個星座不起作用? 任何想法?
它肯定需要myWeb.AllowUnsafeUpdates = true; 在更新任何列表項之前。 不要忘記在更新后將其重置為false。
我要確保的一件事是確保代碼正在運行的用戶具有更新項目的完全權限。 我建議,以站點管理員身份登錄並嘗試從按鈕單擊事件(而不是計時器作業)或其他事件運行代碼,以確保它不是用戶權限問題。
謝謝
Senthil S.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.