Wie "stoppen" Sie die Aktivierung einer Funktion innerhalb des Feature -Empfängers?
-
16-10-2019 - |
Frage
Ich habe einen Feature -Receiver mit einem langen Code, daher verwende ich SPLongOperation
und delegate
für ein besseres visuelles Erscheinungsbild. Grundsätzlich sieht mein Feature -Empfänger so aus:
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);
});
}
Mein Problem ist, dass bei einem Fehler in meinem benutzerdefinierten Code die Funktion immer noch "aktiviert" ist - in der Features -Liste wird er weiterhin als aktiviert angezeigt, obwohl eine Ausnahme aufgetreten ist.
Wie mache ich die Ausnahme zurück zu FeatureActivated
Oder wie kann ich verhindern, dass die Funktion als "aktiviert" angezeigt wird, obwohl sie auf einen Fehler gestoßen ist?
Aktualisieren:
Ich weiß schon, dass die Ausnahme in die in das ausgelöst wird delegate
wird einfach nicht an die übergeben FeatureActivated
Methode, daher die Funktion bereits aktiviert, während die delegate
könnte noch laufen.
Ich könnte mit dem Delegierten herumgehen, aber um eine Splongoperation zu instanziieren, brauche ich eine Page
zu passieren - wie würde ich eine bekommen Page
ohne zu haben this.Page
Innerhalb eines Feature -Empfängers?
Folgendes sollte funktionieren:
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);
});
}
Wenn eine Funktion in meinen benutzerdefinierten Code geworfen wird, wird die Ausnahme an die Feature -Aktivierung übergeben und die Funktion nicht aktiviert - nur Problem: Welche Seite soll bestehen?
Lösung
Fand die Antwort:
Das Problem wirklich war dass die Ausnahme in die geworfen wurde delegate
. Daher die FeatureActivated
Lief einfach reibungslos und die Funktion schien aktiviert zu sein.
Glücklicherweise Splongoperation kann mit einer Seite instanziiert werden: new SPLongOperation(Page page)
- Problem ist, dass ich in einem Feature -Empfänger nicht habe this.Page
.
Ich fand das Schöne HttpContext.Current.Handler
Das kann zwar als Seite gegossen werden.
Das Folgende macht den Trick:
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;}
}
Wenn eine Ausnahme in den langen Betrieb geworfen wird, wird sie weiterhin zum Feature -Empfänger zurückgeworfen (FeatureActivated
) Und die Funktion fällt anmutig aus - was bedeutet, dass es nicht aktiviert wird.
Andere Tipps
Featurectivated ist ein asynchrones Ereignis, das passiert nach Die Funktion wurde aktiviert. Ich kenne keine Möglichkeit, den Aktivierungsstatus zu ändern, außer zu deaktivieren (spFeature.remove (id)) Die Funktion programmatisch, aber nicht sicher, dass Sie das wollen, was Sie wollen ...
Sich ansehen Dies Blog. In dem markierten Abschnitt SharePoint -Ausnahmehandling:
Wenn Sie die Ausnahme nur dann fangen und protokollieren, ohne die Spexception zu werfen, wird die Funktion die angeforderte Funktionsaktivierung oder -Deaktivierung (die der Benutzer derzeit anfordert) abgeschlossen, anstatt die Funktionsaktivierung oder -abaktivierung abzubrechen.