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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit sharepoint.stackexchange
scroll top