Come si fa a “fermata” l'attivazione di una funzione all'interno del ricevitore funzione?
-
16-10-2019 - |
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
Soluzione
Trovato la risposta:
Il problema davvero è stata ??strong> 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.