Frage

Ich habe so etwas verwendet

 using (SPWeb web = SPControl.GetContextWeb(Context))

Bei der Bereitstellung des Projekts zeigt es jedoch einen Fehler. Während ich versuchte, die Ursache herauszufinden, stieß ich auf einen MSDN -Artikel:

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.spontrol.getcontextweb.aspx

das heißt dies:

Verwenden Sie nicht die Entsorgung oder Schließung der SPWeb -Klasse, um das von der GetContextWeb -Methode zurückgegebene Objekt zu schließen. Lassen Sie stattdessen Windows SharePoint -Dienste oder Ihre Portalanwendung das Objekt verwalten.

Ich bin neu in SharePoint. Kann mir jemand den Grund dafür erklären?

War es hilfreich?

Lösung

Wenn Sie den SPWEB aus dem Kontext erhalten, wurde er an anderer Stelle erstellt, und das wird es anderswo für Sie zerstören.

Wenn Sie es zu früh zerstören (zu entsorgen), wenn die Seite es zur Verfügung stellt, wird sie höchstwahrscheinlich in Panik geraten, und einige Daten, die zur Generierung der Seite verwendet werden, werden wahrscheinlich verloren gehen.

Faustregel - Wenn Sie spsites.openweb () oder auf andere Weise neue SPWeb () verwenden, müssen Sie es selbst entsorgen (oder in eine Verwendungsanweisung einbeziehen). Dies gilt gleichermaßen für Webs, die über eine SPWebcollection abgerufen wurden (z. B. spweb.webs, spsine.allwebs oder spweb.getsubwebsbforcurrentuser ()).

Andere Tipps

Das Dispose() Methode wenn die IDisposal Die Schnittstelle ist eine spezifische Schnittstelle, die verwendet wird, wenn Objekt schwere und teure Ressourcen sperrt. Zum Beispiel, wenn Sie eine Verbindung zu einer Datenbank erstellen. Die Methode zur Entsorgung besteht darin, das Objekt mitzuteilen, dass ich mit der Verbindung (im SQL -Fall) fertig bin und dass Sie es jetzt schließen und jemand anderem die Ressource verwenden lassen können. In .NET ist alles in verwalteten Code und automatisch gesammeltem Müll geschrieben, während SQL -Verbindungen und COM+ -Objekte nicht automatisch freigegeben werden.

Im Fall von SharePoint ist es (seit Jahren), wann und wie man Objekte entsetzt. James erklärt es gut mit der Faustregel. Der Grund, warum Sie in einigen Fällen entsorgen müssen, ist, dass SharePoint nicht verwaltete Code (COM+) in verwendet SPSite und SPWeb Objekte zum Beispiel machen Datenbankaufrufe. Wenn die Objekte nicht ordnungsgemäß ordnungsgemäß entsorgt werden, werden Sie irgendwann den Speicher ausmachen, da der Müllsammler in .NET die Objekte "extern" (an .NET) nicht automatisch loslassen kann.

In Ihrem Fall sollten Sie nicht Verwenden Sie das using Anweisung, da es das Objekt automatisch entsetzt. Die Verwendungsanweisung wird im Compiler so erweitert, von

using (SPWeb web = SPControl.GetContextWeb(Context)) {
    ...
}

dazu:

try (SPWeb web = SPControl.GetContextWeb(Context)) {
    ...
}
finally {
    web.Dispose();
}

Ich bin auch mit SharePoint -Entwicklung auf dem neuesten Stand und habe gefunden und gefunden Entsorgen Sie Muster mit gutem Beispielsweise eine großartige Referenz zu diesem Thema sein. Hoffe das hilft dir genauso wie es mir geholfen hat.

Wenn Sie Zweifel haben, ob Sie das entsorgen oder nicht, hat Microsoft das SPDisposecheck -Werkzeug verfügbar, um es für Sie zu überprüfen. Sie können diese manuell direkt aus Visual Studio ausführen oder sogar in die Validierung auf Ihrem Build -Server einbeziehen.

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