Question

J'ai quelque chose utilisé comme

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

mais lors du déploiement du projet, il affiche une erreur. Tout en essayant de comprendre la cause que je suis tombé sur un article de msdn:

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

qui stipule ceci:

Ne pas utiliser la méthode Dispose ou la méthode Close de la classe SPWeb pour fermer l'objet retourné par la méthode de GetContextWeb. Au lieu de cela laissez Windows SharePoint Services ou votre application de portail gérer l'objet.

Je suis nouveau à SharePoint, quelqu'un peut me expliquer la raison derrière cela?

Était-ce utile?

La solution

Si vous obtenez le SPWeb du contexte, il a été créé ailleurs, et que d'ailleurs détruira pour vous.

Si vous destroy (Jeter) trop tôt, lorsque la page est en disposer, il va très probablement la panique, et certaines données utilisées pour générer la page sera probablement perdue.

Règle de base - si vous utilisez SPSite.OpenWeb () ou utiliser de nouveaux SPWeb (), alors vous devez vous débarrasser de vous-même (ou inclure dans une déclaration à l'aide). Cela vaut aussi bien pour des bandes extraites par l'intermédiaire d'un SPWebCollection (par exemple SPWeb.Webs, SPSite.AllWebs ou SPWeb.GetSubwebsForCurrentUser ()).

Autres conseils

La méthode Dispose() si l'interface IDisposal est une interface specifc qui est utilisé lorsque l'objet verrouille les ressources lourdes et coûteuses. Par exemple, lorsque vous l'acquisition d'une connexion à une base de données. La méthode Dispose est là pour dire l'objet que je suis fait avec la connexion (dans le cas Sql) et que vous pouvez maintenant fermer et laisser quelqu'un d'autre utiliser la ressource. Dans tout .NET est écrit en code managé et automatiquement les déchets collectés, alors que les connexions SQL et les objets COM + ne sont pas libérés automatiquement.

Dans le cas de SharePoint, il a été une discussion (depuis des années) quand et comment se débarrasser des objets. James explique bien la règle générale. La raison pour laquelle vous devez appeler Dispose dans certains cas, que SharePoint utilise le code non géré (COM +) dans les objets SPSite et SPWeb à des appels de base de données par exemple de faire. Si les objets ne sont pas disposés correctement, vous allez finir par manquer de mémoire depuis le garbage collector .NET ne peut pas libérer automatiquement le « externe » (.NET) des objets.

Dans votre cas, vous devez pas utiliser l'instruction using car il disposera automatiquement l'objet. L'instruction à l'aide est étendu comme celui-ci dans le compilateur, de

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

à ceci:

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

Je me lève à la vitesse avec le développement SharePoint ainsi et nous avons constaté Eliminer modèles par exemple pour être une grande référence à ce sujet. Espérons que cela vous aide autant qu'il m'a aidé.

Si vous êtes dans le doute quant à savoir si ou non vous manipulez correctement le Éliminez, Microsoft a outil SPDisposeCheck disponible pour le vérifier pour vous. Vous pouvez exécuter manuellement, directement à partir de Visual Studio ou même incorporer dans la validation de votre serveur de build.

Licencié sous: CC-BY-SA avec attribution
Non affilié à sharepoint.stackexchange
scroll top