Как мне протестировать EventReceiver?

Я схожу с ума, пытаясь заставить работать приемник событий списка SharePoint. Я создал проект EventReceiver в VS и могу его отлаживать, однако точки останова не работают. По сути, это та же проблема, с которой сталкивались многие люди, но ни одно из их решений, похоже, не работает. Я публиковал это раньше и думаю, что мой код приемника событий должен работать, но я не могу заставить его работать с самим списком. (мой код вставлен ниже)

По сути, все, что мне нужно, - это переименовать получатель событий загружаемый документ. Рассмотрим этот сценарий, если загруженный документ называется Client A Document и является первым документом, он должен называться Client A Document 1. Если следующий загруженный документ называется Client A Document, его следует переименовать в Client A Document 2 и т. Д. . Теперь, если загружен другой документ с именем Client B Document, это должен быть только Client B Document 1, поскольку других с таким же именем нет. Теперь я думаю, что мой код ниже выполняет это поведение (код был написан благодаря помощи Роберта Кристса!), Но я не знаю, как это проверить.

Я загружаю документ или создаю новый? Я пробовал оба, и ничего не работает, у кого-нибудь есть идеи, как это сделать? Я начинаю терять рассудок от этого требования.

public override void ItemAdding(SPItemEventProperties properties)
{
   base.ItemAdding(properties);

   SPListItem item = properties.ListItem;

   if (item == null || item["Name"] == null) //item["Name"] == null)
       return; //or better yet, log 

   string oldFileName = item["Name"].ToString();

   int positionOfPeriod = oldFileName.LastIndexOf(".");
   string tempFileName = oldFileName.Substring(0, positionOfPeriod);

   SPQuery query = BuildArbitraryQuery(properties.List, "Name", tempFileName, true);
   int count = properties.List.GetItems(query).Count;
   String fileName, fileExtension;

   if (positionOfPeriod == -1)
   {
       fileName = oldFileName;
       fileExtension = "";
   }
   else
   {
       fileName = oldFileName.Substring(0, positionOfPeriod);
       fileExtension = oldFileName.Substring(positionOfPeriod);
   }

   string newFileName = fileName + "-xx" + count.ToString() + fileExtension;

   item["Name"] = newFileName;

   Console.WriteLine("New File Name: " + newFileName);

   try
   {
       properties.Web.AllowUnsafeUpdates = true;
       EventFiringEnabled = false;

       item.Update();
   }
   finally
   {
       properties.Web.AllowUnsafeUpdates = false;
       EventFiringEnabled = true;
   }
}
/// <summary> 
/// Builds an arbitrary SPQuery which filters by a single column value. 
/// </summary> 
/// <param name="list">The list you will run the query against.</param> 
/// <param name="columnDisplayName">The Display Name of the column you want to filter.</param> 
/// <param name="value">The value to filter against.</param> 
/// <returns>A new SPQuery object ready to run against the list.</returns> 
public static SPQuery BuildArbitraryQuery(SPList list, string columnDocumentName, string value, bool deepSearch)
{
   if (list == null)
       throw new ArgumentNullException("You cannot pass a null list to Helper.BuildArbitraryQuery.");

   if (!list.Fields.ContainsField(columnDocumentName))
       throw new ArgumentException("The SharePoint List \"" + list.Title + "\" does not contain the Field \"" + columnDocumentName + "\".");

   string internalName = list.Fields[columnDocumentName].InternalName;
   SPQuery query = new SPQuery();
   query.Query = "<Where><Eq><FieldRef Name=\"" + internalName + "\"/><Value Type=\"Text\">" + value + "</Value></Eq></Where>";

   if (deepSearch)
       query.ViewAttributes += "Scope='RecursiveAll'";

   return query;
}

РЕДАКТИРОВАТЬ:------------------------------------------------ - Хорошо, поэтому я провел небольшой тест, начатый с того же типа проекта (приемник событий), и создал очень простой метод ItemAdded для изменения имени элемента списка на текущую дату. Теперь это работает с настраиваемым списком, но я не могу заставить это работать с библиотекой документов.

Итак, из этого небольшого теста я знаю, что могу зарегистрировать получателя событий в настраиваемом списке (изолированное решение) с помощью F5 и отладить его, но чем отличаются библиотеки документов? И мой код, который я вставил, не подходит для того, что я пытаюсь сделать в библиотеке документов?

Это код, который я использовал для небольшого теста, но он не работает с библиотеками документов, даже если я создаю новый тип проекта для библиотек документов, а не для настраиваемых списков (это в ItemAdded)

       SPListItem currentItem = properties.ListItem;
       currentItem["Title"] = DateTime.Now.ToString();
       currentItem.Update();

person Tudor Hofnar    schedule 07.09.2012    source источник
comment
Вы зарегистрировали свой приемник событий? Вы уверены, что ваш приемник событий не вызывается? вы пробовали поставить точку останова в самом начале приемника событий?   -  person petro.sidlovskyy    schedule 07.09.2012
comment
Самое раннее место, в которое я могу поместить EventReceiver, находится в первой строке ItemAdding ... поэтому я поместил его туда, но мой код не сломается, пожалуйста, смотрите мой комментарий ниже к сообщению user735768 для более подробной информации.   -  person Tudor Hofnar    schedule 07.09.2012


Ответы (2)


Вот что вам следует делать:

  1. Перезапустите IIS, «чтобы выгрузить библиотеки DLL, если они используются».
  2. Поместите свою DLL и ее файл pdb в папку GAC, подходящую для этой DLL.
  3. откройте веб-сайт SharePoint, чтобы запустить новый процесс w3wp.
  4. Прикрепив свой проект VS к w3wp, убедитесь, что вы выбрали управляемый код в диалоговом окне присоединения к процессу.
  5. Попробуйте загрузить файл 6 - теперь вы сможете определить точку останова.

Вы можете создать сценарий оболочки, который будет вызываться в событии после сборки, чтобы автоматизировать все эти шаги.

person Mahmoud Fayez    schedule 07.09.2012
comment
Я не уверен, куда вы хотите поместить файл pdb, GAC выдает ошибку, если я пытаюсь поместить туда pdb, поэтому я просто помещаю DLL в GAC. Я открыл sharepoint и подключился к процессу, как вы и сказали, но все еще нет точек останова, даже когда я загружаю файл. Есть другие идеи? - person Tudor Hofnar; 08.09.2012
comment
Взгляните на эту ссылку timrayburn.net/blog/ как поставить pdbs-in-the-gac - person Mahmoud Fayez; 08.09.2012
comment
Я копирую dbp в C: \ Windows \ Microsoft.NET \ assembly \ GAC_MSIL \ dll name folder \ после запуска gacutil.exe -if для установки dll в GAC. после этого запускаю iisreset. сделайте с шага 3 по шаг 5. - person Phan Đức Bình; 02.12.2016

Как именно вы пытались отлаживать? Вам необходимо подключиться к соответствующему процессу w3wp.exe и добавить элемент, если точки останова не работают, это обычно связано с тем, что версия последней развернутой dll новее, чем ваш код в Visual Studio (даже малейшее изменение может вызвать эту разницу как новая строка и т. д.)

person liranco    schedule 07.09.2012
comment
Итак, для отладки я подключился к процессу w3wp и нашел подходящий для своего пула приложений. Я поместил точку останова в первую строку в ItemAdding и нажал F5. Теперь точка останова становится пустой (а не красной, как обычно), и в ней говорится, что символы не были загружены, я пытался загрузить символы с помощью окна модулей, но он все равно не загружает их, где мне их искать? - person Tudor Hofnar; 07.09.2012
comment
Я дважды пытался воссоздать проект, но все еще не могу заставить его работать, я использовал проект EventReceiver и проверил в папке / bin проекта, что файлы dll и pdb имеют одинаковое имя и время, что еще я должен проверить? - person Tudor Hofnar; 07.09.2012
comment
не нужно нажимать F5, он должен улавливать все, что появляется из вашего кода в sharepoint. В любом случае, если точка останова пустая, обычно это связано с различиями между последней развернутой dll и вашим текущим кодом в Visual Studio (просто выполните повторное развертывание, чтобы убедиться). Другой вариант - это то, что предложил Петр проверить его комментарий. - person liranco; 07.09.2012
comment
Как я могу это исправить? Я попытался очистить и перестроить проект, но у меня ничего не вышло. Я сделал что-то не так, когда впервые построил проект? - person Tudor Hofnar; 07.09.2012
comment
Как вы развертываете приемник событий и регистрируете его? - person liranco; 07.09.2012
comment
Я просто щелкаю правой кнопкой мыши по решению и выбираю «Развернуть». В проекте EventReceiver есть особенность, так что я думаю, что его скрепят? Я добавляю этот EventReceiver ко всему сайту, а не только к конкретной библиотеке. Раньше я регистрировал его с помощью консольного приложения, но это тоже не сработало, я тоже не мог понять проблему с точками останова. Для этого проекта я следовал инструкциям MSDN msdn.microsoft.com/en-us/ library / gg749858.aspx - person Tudor Hofnar; 07.09.2012
comment
Какой из них является правильным / предпочтительным? Или есть лучший, чем два? - person Tudor Hofnar; 07.09.2012