Domanda

Ho qualcosa usato come

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

, ma durante la distribuzione del progetto mostra un errore. Durante il tentativo di capire la causa mi sono imbattuto in un articolo di MSDN:

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

in cui si afferma questo:

Non utilizzare il Dispose o il metodo Close della classe SPWeb per chiudere l'oggetto restituito attraverso il metodo GetContextWeb. Invece consentono di Windows SharePoint Services o l'applicazione portale gestire l'oggetto.

Sono nuovo di SharePoint, qualcuno mi può spiegare la ragione di questo?

È stato utile?

Soluzione

Se si ottiene lo SPWeb dal contesto, che è stato creato altrove, e che altrove distruggerà per voi.

Se distruggi (Eliminare) troppo presto, quando la pagina viene di disporne, sarà molto probabilmente il panico, e alcuni dati utilizzati per generare la pagina sarà probabilmente perso.

Regola empirica - se si utilizza SPSite.OpenWeb () o in altro modo utilizzare le nuove SPWeb (), poi si deve smaltire da soli (o includere in un'istruzione using). Ciò vale anche per nastri recuperati tramite uno SPWebCollection (ad esempio SPWeb.Webs, SPSite.AllWebs o SPWeb.GetSubwebsForCurrentUser ()).

Altri suggerimenti

Il metodo Dispose() se l'interfaccia IDisposal è un'interfaccia specifc utilizzata quando oggetto blocca risorse pesanti e costosi. Per esempio quando si sta acquisendo una connessione a un database. Il metodo Dispose è lì per dire l'oggetto che ho fatto con la connessione (nel caso Sql) e che ora è possibile chiudere e lasciare che qualcun altro utilizzare la risorsa. In .NET tutto è scritto in codice gestito e garbage collection automatica, mentre le connessioni SQL e COM + oggetti non vengono rilasciati automaticamente.

Nel caso di SharePoint è stata una discussione (ormai da anni) su quando e come eliminare gli oggetti. James spiega bene con la regola del pollice. Il motivo è necessario chiamare Dispose, in alcuni casi è che SharePoint utilizza il codice non gestito (COM +) in SPSite e SPWeb oggetti per le chiamate al database esempio make. Se gli oggetti non vengano smaltiti correttamente è infine esaurire memoria dall'avvio del garbage collector NET non può rilasciare automaticamente il "esterno" (per NET) oggetti.

Nel tuo caso si dovrebbe non utilizzare l'istruzione using poiché disporrà automaticamente l'oggetto. La dichiarazione viene espansa utilizzando come questo nel compilatore, da

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

a questo:

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

Io sono sempre al passo con lo sviluppo di SharePoint come bene e trovate modelli disporre in Esempio per essere un grande riferimento sull'argomento. Spero che questo ti aiuta tanto quanto mi ha aiutato.

Se si è in dubbio se o non si gestisce il corretto smaltimento, Microsoft ha la strumento SPDisposeCheck a disposizione per controllare per voi. È possibile eseguire questa operazione manualmente, direttamente da Visual Studio o anche incorporarlo nella convalida sul server di build.

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