2013-04-11 1 views
1

Я пытаюсь реализовать архитектуру плагина для нашего решения Sharepoint в тот момент, когда администраторы могут загружать файлы DLL, которые будут установлены и обработаны нашим решением.GacInstall on Sharepoint Timer Работа a.k.a SPJobDefinition

Реализация требует установки GAC в DLL загруженном, который я достиг с помощью

private void InstallToGac(byte[] libraryContent, string filename) 
     { 
      string path = tempFolder + filename; 
      File.WriteAllBytes(path, libraryContent); 
      try 
      { 
       new System.EnterpriseServices.Internal.Publish().GacInstall(path); 
      } 
      catch (Exception ex) 
      { 
       Logger.Error("Error while installing dll to GAC.", ex); 
       throw; 
      } 
      finally 
      { 
       File.Delete(path); 
      } 
     } 

Это просто устанавливает DLL в GAC и работает нормально, если она вызывается в Sharepoint контексте. Тем не менее, он не будет работать в многосерверной среде, так как это будет устанавливать его только на интерфейсе, где администратор загрузил файл. Итак, я переместил код выше в задание таймера, наследуя SPJobDefinition. GacInstall больше не устанавливает DLL в GAC. В режиме отладки GacInstall линия работает отлично, не бросая никаких исключений, но без какого-либо эффекта.

System.Security.Principal.WindowsIdentity.GetCurrent().Name; 

Network Service в задании таймера. Я работаю на одном сервере Sharepoint 2010 Foundation, но мне нужно, чтобы он работал в 2007/2010/2013 как в одном, так и в многосерверном окружении.

ответ

0

Оказалось, что Network Service был проблемой все время. Я не рассматривал это как проблему, так как все мои пулы приложений Sharepoint запускались через Network Service и как-то функционировали нормально. Изменение «Log On As» из «Sharepoint 2010 Timer» на «Local Services» исправило это.

Также выясняется, что GacInstall(path) не вызывает исключение в некоторых случаях, включая этот, и генерирует событие Windows без полезной информации, как указано here.

Смежные вопросы