Domanda

Ho un ricevitore funzione con un po 'di codice lunga corsa, quindi io uso SPLongOperation e delegate per l'apparenza visiva migliore. Fondamentalmente la mia caratteristica aspetto del ricevitore in questo modo:

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

Il mio problema è che quando si verifica un errore nel mio codice personalizzato, la caratteristica ancora è "attivato" -. Nella lista delle caratteristiche che ancora mostra come l'attivazione, anche se si è verificata un'eccezione

Come faccio a buttare la schiena eccezione a FeatureActivated o come faccio a fermare la caratteristica di apparire come "attiva" anche se ha incontrato un errore?


Aggiornamento:

Lo so già che l'eccezione generata all'interno del delegate non è solo passato al metodo FeatureActivated, da qui la funzione attiva già mentre il delegate potrebbe essere ancora in esecuzione.

ho potuto ottenere intorno usando il delegato, ma ad un instanziazione SPLongOperation ho bisogno di un Page di passare - come vorrei avere un Page senza avere this.Page all'interno di un ricevitore funzione

Il seguente dovrebbe funzionare:

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

Quando una funzione viene lanciata all'interno del mio codice personalizzato sarà passato l'eccezione per l'attivazione funzione e la funzione non sarà attivata - unico problema:? A che pagina per passare

È stato utile?

Soluzione

Trovato la risposta:

Il problema davvero è stata che l'eccezione è stata gettata all'interno del delegate. Da qui la FeatureActivated appena è andato bene e la caratteristica sembrava attivata.

SPLongOperation può essere istanziato con Page:. new SPLongOperation(Page page) - problema è che in un Feature ricevitore non ho this.Page

Ho trovato la bella HttpContext.Current.Handler però che può essere colato come pagina.
Quanto segue fa il trucco:

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

Quando viene generata un'eccezione all'interno della lunga operazione, è ancora ributtato al ricevitore funzione (FeatureActivated) e la funzione non riesce con grazia -. Che significa che non venga attivato

Altri suggerimenti

FeatureActivated è un evento asincrono che accade dopo la funzione è stata attivata. Non conosco nessun modo per cambiare lo stato di attivazione salvo disattivazione (SPFeature.Remove (id)) la funzione di programmazione, ma non è sicuro è ciò che volete ...

Date un'occhiata a questo blog . Nella sezione contrassegnata SharePoint gestione delle eccezioni :

Se solo si cattura e accede l'eccezione senza gettare lo SPException allora la funzione completerà l'attivazione funzione richiesta o disattivazione (che mai l'utente è attualmente richiede) invece di interrompere l'attivazione funzione o la disattivazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top