Служба SharePoint OWSTIMER, хранящая ссылки на сборки приемников признаков

В SharePoint вы можете использовать Feature Receiver для выполнения некоторых действий, когда функция устанавливается/удаляется и т. д.

Приемник функций запускается из службы OWSTIMER, и процесс выглядит примерно так.

  • .wsp (cab-файл) распаковывается и проверяется
  • .dll перемещены в bin/gac
  • получатели функций, отмеченные в манифесте, вызываются (могут быть только в GAC) службой

Однако OWSTIMER держит дескриптор dll, содержащий приемник функции, открытым.

Это означает, что при удалении функции Fusion переместит dll в каталог c:\windows\temp\ и сохранит ссылку. (Подробнее здесь и здесь)

Когда вы затем попытаетесь установить новую версию (версия файла сборки отличается, но версия сборки должна остаться прежней), OWSTIMER запустит СТАРЫЙ приемник функций.

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

Кто-нибудь знает обходные пути?


person Ryan    schedule 18.02.2011    source источник


Ответы (2)


Выполните iisreset между переключением функций.

Да, останавливает все веб-приложения, но именно поэтому вы запланировали простои / делаете это в нерабочее время. И убедитесь, что процесс хорошо отрепетирован на ваших машинах разработки.

person James Love    schedule 18.02.2011
comment
IISRESET не будет работать, так как процесс размещается OWSTIMER, а не w3pwp — вы можете выполнить net stop... / net start... но, как объяснено, это будет PITA на производственных фермах — не совсем простая модель развертывания. и высмеивает идею выполнения операций STSADM с одного сервера для управления всей фермой. - person Ryan; 19.02.2011
comment
Хороший момент — я полностью упустил это из виду :) Взгляните на это, возможно, вам понадобится разработать расширение: sharepoint.mindsharpblogs.com/Paul/archive/2008/09/12/ - person James Love; 19.02.2011
comment
Сказав это, у меня была проблема с зависанием сборок в GAC в функции, которую я тестировал в последнее время (неоднократно тестировал сценарий обновления в 2007 году [болезненно! [) - каждый раз, когда IISRESET исправлял это - но как вы скажем - это не должно иметь никакого эффекта :| - person James Love; 19.02.2011

Обходных путей нет, но в производственной среде, где у вас много серверов, вам не следует вручную добавлять и удалять DLL из GAC из GAC.

Если вы развертываете через функциональную архитектуру, SharePoint автоматически позаботится об этом.

Тем не менее, если вам нужно синхронизировать запуск/остановку служб Windows (включая OWSTIMER и IIS) на нескольких серверах в ферме, это так же просто, как написать пакетный сценарий для использования:

SC \\SERVER1 STOP W3SVC
SC \\SERVER1 STOP SPTIMERV4
SC \\SERVER2 STOP W3SVC
SC \\SERVER2 STOP SPTIMERV4

Затем перезапустите со следующим:

SC \\SERVER1 START SPTIMERV4
SC \\SERVER1 START W3SVC
SC \\SERVER2 START SPTIMERV4
SC \\SERVER2 START W3SVC
person Charles Chen    schedule 25.11.2013
comment
Я не выполнял GAC вручную и не удалял DLL-файлы GAC - все прошло через обычную архитектуру функций, и SharePoint (2007 и 2010, и я предполагаю, 2013) НЕ позаботится об этом автоматически - это было подтверждено MS Developer служба поддержки. - person Ryan; 27.11.2013