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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top