Состояние гонки в splisteventReceiver.listadaded - Save Conflict
-
16-10-2019 - |
Вопрос
В настоящее время я разрабатываю обработчик событий для SharePoint 2010, который устанавливает по умолчанию библиотеки документов на создание (типы контента, настройки версий и т. Д.). У меня возникает проблема с конфликтами сохранения при создании библиотек документов через графический интерфейс, получатель событий не всегда работает после того, как графический интерфейс будет сохранен список.
Я предположил ListAdded
будет вызван после того, как графический интерфейс правильно закончил создание списка и сохранил его, но, похоже, это не так. Я пытался установить свойства в ListAdding
Функция, но изменения не сохраняются (так как список еще не создан).
Я получаю следующее сообщение при отладке в Visual Studio:
Сохранить конфликт.
Ваши изменения вступают в противоречие с теми, которые были сделаны одновременно другим пользователем. Если вы хотите, чтобы ваши изменения были применены, нажмите обратно в свой веб -браузер, обновите страницу и повторно повторно измените свои изменения.
с трассировкой стека:
Microsoft.sharepoint.spexception не было невозможно не считать код пользователя errorcode = -2130575305 CnipeerRormessage = не выполняется HR обнаружен (HR = 0x81020037)
Nativestacktrace = "" Сообщение = Сохранить конфликт.
Ваши изменения вступают в противоречие с теми, которые были сделаны одновременно другим пользователем. Если вы хотите, чтобы ваши изменения были применены, нажмите обратно в свой веб -браузер, обновите страницу и повторно повторно измените свои изменения. Source = microsoft.sharepoint stacktrace: at microsoft.sharepoint.spglobal.handlecomexception (comexception comex) на microsoft.sharepoint.library.sprequest.setlistrops (String bstrurl, String bstristname, boolean bmigrate) at microsoft.sharepoint.splist. ) at Company.SharePoint.EventReceivers.ListCreate.CompanyListCreateEventReceiver.ListAdded(SPListEventProperties properties) at Microsoft.SharePoint.SPEventManager.RunListEventReceiver(SPListEventReceiver receiver, SPUserCodeInfo userCodeInfo, SPListEventProperties properties, String receiverData) at Microsoft.SharePoint.SPEventManager.RunListEventReceiverHelper(Object receiver, Spusercodeinfo usercodeinfo, свойства объекта, контекст SpeventContext, String receiverdata) на microsoft.sharepoint.speventmanager. : System.Runtime.InterOpservices.COMEX пробег
и журналы ULS:
25.02.2011 11: 12: 52.06 W3WP.EXE (0x363C) 0x219C Фонд SharePoint Foundation General 8E2S Неизвестная ошибка Sprequest произошла. Дополнительная информация: 0x8007047e F35857AF-3D3A-462C-86A6-DE24D3B3D8D3
25.02.2011 11: 12: 52,06 W3WP.EXE (0x363C) 0x219C Фонд SharePoint General 72K4 Medium 0x8007047e F35857AF-3D3A-462C-86A6-DE24D3B3D8D3
25.02.2011 11: 12: 52,06 W3WP.EXE (0x363C) 0x219C Фонд Шарпойнта генерал 8KH7 HIGH 0x8007047E F35857AF-3D3A-462C-86A6-DE24D3B3D3D3
Существует ли способ обеспечить конфликта, или другого способа настройки или доступа к свойствам списка, которые не будут конфликтовать. Я устал создать отдельный экземпляр SPSite/SpWeb, но у этого все еще есть такая же проблема.
Простым примером кода, который снят, является:
public class CompanyListCreateEventReceiver : SPListEventReceiver
{
public override void ListAdded(SPListEventProperties properties)
{
base.ListAdded(properties);
SPList l_list = properties.List;
l_list.Title = "Changed title";
l_list.Update();
}
}
Любая помощь будет оценена. Спасибо!
Решение
Вы должны зарегистрировать событие ITEMADDED как синхронное событие.Speventreceiversynchronication.synchronous
Вы можете определить это программно:http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.speventreceiverdefinition.synchronization.aspx
Или в элементе приемника определения функции:http://msdn.microsoft.com/en-us/library/ff512765.aspx
Другие советы
Я уже некоторое время борется с приемниками мероприятий SharePoint. Много ловушек и неожиданной логики в этой части SharePoint IMO.
Я раньше не видел эту проблему, но все равно могу дать вам одно предложение. По моему опыту, изменение списка свойств иногда может иметь проблемы. Вот почему я хочу получить список из Интернета. Если это не удается (это сработало для меня), попробуйте создать новый Spweb от web.url.
В этом случае я предлагаю вам попробовать следующий подход:
public class CompanyListCreateEventReceiver : SPListEventReceiver
{
public override void ListAdded(SPListEventProperties properties)
{
base.ListAdded(properties);
SPList l_list = properties.Web.Lists[properties.List.ID];
l_list.Title = "Changed Title";
l_list.Update();
}
}
Я думаю, вам может потребоваться указать «синхронный» в вашем файле element.xml, см. http://sharepointconnoisseur.blogspot.com/2011/04/save-conflict-error-wrating-list.html
Попробуйте использовать отключение события и включить методы событий.
2) (Полезно от обновления элемента от обработчика событий)
Item[FieldName] = FieldValue;
this.DisableEventFiriing();
item.SystemUpdate(false);
or
item.Update();
this.EnableEventFiring();
//must enable event firing if we are disable it