Comment comptez-vous « stop » activation d'une fonction dans le récepteur de fonction?
-
16-10-2019 - |
Question
J'ai un récepteur de fonctionnalité avec un code en cours d'exécution à long, donc j'utilise SPLongOperation
et delegate
pour meilleure apparence visuelle. Fondamentalement, mon apparence récepteur de fonction comme ceci:
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
SPLongOperation.Begin("Header",
"Caption",
delegate(SPLongOperation longOperation)
{
//custom code here
longOperation.End("http://url", SPRedirectFlags.Static,
HttpContext.Current, null);
});
}
Mon problème est que lorsqu'une erreur se produit dans mon code personnalisé, la fonction est toujours « activé » -. Dans les liste des caractéristiques qu'il affiche toujours comme étant activée, même si une exception a eu lieu
Comment puis-je jeter le dos d'exception à FeatureActivated
ou comment puis-je arrêter la fonction d'apparaître comme « activé », même si elle a couru dans une erreur?
Mise à jour:
Je sais déjà que l'exception jetée à l'intérieur du delegate
est tout simplement pas transmis à la méthode de FeatureActivated
, d'où la fonction activée déjà alors que le delegate
pourrait encore être en cours d'exécution.
Je pourrais contourner en utilisant le délégué, mais à une instanciation SPLongOperation je besoin d'une Page
passer - comment pourrais-je obtenir un Page
sans avoir this.Page
l'intérieur d'un récepteur caractéristique
Ce qui suit devrait fonctionner:
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
//Here I need to pass the ManageFeatures.aspx page? Any page? The LongRunningOperation.aspx page?
Page page = new Page();
SPLongOperation operation = new SPLongOperation(page);
operation.Begin();
//custom code here
operation.End("http://url", SPRedirectFlags.Static,HttpContext.Current, null);
});
}
Quand une fonction est jeté dans mon code personnalisé l'exception sera transmise à l'activation de fonction et la fonction ne sera pas activée - le seul problème: quelle page pour passer
La solution
trouvé la réponse:
Le problème vraiment n'a que l'exception était jeté dans le delegate
. D'où le FeatureActivated
juste couru en douceur et la fonction semblait activée.
SPLongOperation peut être instancié avec une page:. new SPLongOperation(Page page)
- problème est que dans une fonction récepteur je n'ai this.Page
Je trouve la belle HttpContext.Current.Handler
mais qui peut être casté comme la page.
Ce qui suit fait le tour:
public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
Page page = HttpContext.Current.Handler as Page;
SPLongOperation operation = new SPLongOperation(page);
operation.Begin();
try
{
//custom code here
operation.End("http://url", SPRedirectFlags.Static,HttpContext.Current, null);
}
catch (ThreadAbortException) {}
catch (Exception ex) {throw ex;}
}
Quand une exception est levée dans le fonctionnement à long, il est encore jeté vers le récepteur de fonction (de FeatureActivated
) et la fonction échoue avec élégance -. Ce qui signifie qu'il ne soit pas activé
Autres conseils
FeatureActivated est un événement asynchrone qui arrive après la fonction a été activée. Je ne connais aucun moyen de changer l'état d'activation sauf désactivation (SPFeature.Remove (id)) la fonction programmation, mais pas sûr c'est ce que vous voulez ...
Jetez un oeil à ce blog . Dans la section marquée SharePoint gestion des exceptions :
Si vous ne surprenez et connectez l'exception sans jeter la SPException alors la fonction complètera l'activation de fonctionnalité demandée ou de désactivation (qui jamais l'utilisateur demande actuellement) au lieu d'annuler l'activation de fonction ou de désactivation.