2010-09-21 2 views
2

Я делаю простой импортер новостей для сайта sharepoint с использованием задания таймера, которое выполняется каждые несколько минут. Код ниже работает нормально, если я запускаю его в веб-части, но бросает MissingMethodException при запуске в методе Execute задания таймера.Создание страницы публикации в задаче таймера SharePoint Задает MissingMethodException

Полное исключение:

System.MissingMethodException was unhandled by user code 
    Message="No parameterless constructor defined for this object." 
    Source="mscorlib" 
    StackTrace: 
     at System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandle& ctor, Boolean& bNeedSecurityCheck) 
     at System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean fillCache) 
     at System.RuntimeType.CreateInstanceImpl(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean fillCache) 
     at System.Activator.CreateInstance(Type type, Boolean nonPublic) 
     at System.Activator.CreateInstance(Type type) 
     at Microsoft.SharePoint.WebPartPages.SPWebPartSerializer.get_DefaultControl() 
     at Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.Serialize(PersonalizationScope scope) 
     at Microsoft.SharePoint.WebPartPages.BinaryWebPartSerializer.get_Links() 
     at Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartToStore(WebPart webPart, Int32 viewId, String viewGuid) 
     at Microsoft.SharePoint.WebPartPages.SPWebPartManager.AddWebPartInternal(SPSupersetWebPart superset, Boolean throwIfLocked) 
     at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPartInternal(WebPart webPart, String zoneId, Int32 zoneIndex, Boolean throwIfLocked) 
     at Microsoft.SharePoint.WebPartPages.SPLimitedWebPartManager.AddWebPart(WebPart webPart, String zoneId, Int32 zoneIndex) 
     at Microsoft.SharePoint.Publishing.PublishingPage.CopyAllWebParts(String destinationPageUrlServerRelative, SPWeb destinationPageWeb, String sourcePageUrlServerRelative, SPWeb sourcePageWeb, Boolean shouldOverwriteDestinationWebParts) 
     at Microsoft.SharePoint.Publishing.PublishingPageCollection.<>c__DisplayClass5.<Add>b__0() 
     at Microsoft.Office.Server.Diagnostics.FirstChanceHandler.ExceptionFilter(Boolean fRethrowException, TryBlock tryBlock, FilterBlock filter, CatchBlock catchBlock, FinallyBlock finallyBlock) 
     at Microsoft.Office.Server.Diagnostics.ULS.SendWatsonOnExceptionTag(ULSTagID tagID, ULSCat categoryID, String output, Boolean fRethrowException, TryBlock tryBlock, CatchBlock catchBlock, FinallyBlock finallyBlock) 
     at Microsoft.SharePoint.Publishing.PublishingPageCollection.Add(String name, PageLayout layout) 
     at Virtua.SharePoint.Mercator.NewsImportJob.Execute(Guid contentDbId) 
     at Microsoft.SharePoint.Administration.SPTimerJobInvoke.Invoke(TimerJobExecuteData& data, Int32& result) 
    InnerException: 

Код:

var SPWebUri = new Uri("http://.../News/"); 
using (SPSite site = new SPSite(SPWebUri.AbsoluteUri)) 
{ 
    using (SPWeb web = site.OpenWeb(SPWebUri.AbsolutePath)) // tried 0x29A's anwser, but it didn't work 
    // using (SPWeb web = site.OpenWeb()) 
    { 
     web.AllowUnsafeUpdates = true; 

     PublishingWeb publishingWeb = PublishingWeb.GetPublishingWeb(web); 
     SPContentTypeId contentTypeId = new SPContentTypeId("..."); 

     PageLayout layout = publishingWeb.GetAvailablePageLayouts(contentTypeId).First(l => l.Name == "....aspx"); 
     PublishingPageCollection pages = publishingWeb.GetPublishingPages(); 

     var spFilename = "testing"; 

     // error line below 
     var newPage = pages.Add(String.Format("{0}.aspx", spFilename), layout); 

     // set newPage's fields 

     // check-in and publish page 
    } 
} 

ответ

0

Проблема была неисправна веб-часть на мой макет страницы. Я использовал SPContext.Current... в конструкторе. Теперь, по-видимому, SPContext вещей просто нет, когда выполняется задание таймера (не удивительно).

Поскольку ошибка не была обработана, менеджер веб-частей попытался заменить мою часть ErrorWebPart (тот, который обычно говорил пользователю, что-то пошло не так). По какой-то причине это отлично работает при отображении страницы в браузере. Но в задании таймера SharePoint пытается создать ErrorWebPart путем отражения с помощью безпараметрического конструктора, который является не указан в ErrorWebPart, и все это просто разрушается с MissingMethodException.

Перемещение оскорбительного кода на метод CreateChildControls (где у меня есть обработка ошибок) решила проблему.

1

Не уверен, но это может быть, что вам нужно предоставить параметр URL-адрес для site.OpenWeb() Если параметр URL пуст , должен быть открыт сайт верхнего уровня. Это может объяснить, почему он работает в веб-части, но не из задания таймера. См. MSDN - Site.OpenWeb Method.

С уважением

+0

Нет, это не сработало. +1 для указания другой возможной ошибки :-) – Luc

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