2010-09-21 3 views
2

Je fais un simple importateur de nouvelles pour un site SharePoint en utilisant un travail du minuteur qui s'exécute toutes les quelques minutes. Le code ci-dessous s'exécute correctement si je l'exécute dans une partie Web, mais renvoie MissingMethodException lorsque exécuté dans la méthode Execute du travail du minuteur.Création d'une page de publication dans le travail du minuteur SharePoint throws MissingMethodException

L'exception complète:

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: 

Le code:

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 
    } 
} 

Répondre

0

Le problème était une partie défectueuse web sur ma mise en page. J'utilisais SPContext.Current... dans le constructeur. Maintenant, apparemment, SPContext choses ne sont tout simplement pas là lors de l'exécution du code de travail du minuteur (pas si surprenant non plus).

Comme l'erreur n'a pas été gérée, le gestionnaire de composants Web a essayé de remplacer ma pièce par un ErrorWebPart (celui qui indique normalement à l'utilisateur que quelque chose s'est mal passé). Pour une raison quelconque, cela fonctionne très bien lors de l'affichage de la page dans le navigateur. Mais dans le travail du minuteur, SharePoint essaie de créer ErrorWebPart par réflexion en utilisant le constructeur sans paramètre qui est non défini dans ErrorWebPart et le tout s'effondre simplement avec MissingMethodException.

Déplacer le code incriminé à CreateChildControls méthode (où j'ai la gestion des erreurs) a résolu le problème.

1

Je ne sais pas, mais pourrait-il que vous devez fournir le paramètre url pour site.OpenWeb() Si le paramètre url est vide , le site de niveau supérieur doit être ouvert. Ce qui peut expliquer pourquoi cela fonctionne dans une partie Web mais pas à partir du travail du minuteur. Voir MSDN - Site.OpenWeb Method pour plus de détails.

Cordialement

+0

Non, cela n'a pas fonctionné. +1 pour signaler un autre bug possible :-) – Luc

Questions connexes