2010-08-16 7 views
0

Je rencontre un problème d'accès aux objets dans deux instances différentes de l'objet SPSite si l'URL de la collection de sites se trouve dans deux sites différents (par exemple, http://mysite/Docs1/ et http://mysite/subsite/Docs2/). Considérez le code suivant:SPSite à partir de deux sites différents

public static void MoveDocument(Uri sourceUrl, Uri destinationUrl) 
{ 
    string sUrl = sourceUrl.ToString(); 
    string dUrl = destinationUrl.ToString(); 

    using (SPSite sourceSite = new SPSite(sUrl)) 
    using (SPSite destinationSite = new SPSite(sUrl)) 
    { 
     SPWeb sourceWeb = sourceSite.OpenWeb(); 
     SPWeb destinationWeb = destinationSite.OpenWeb(); 
     SPFile sourceFile = sourceWeb.GetFile(sUrl); 
     SPFolder destinationFolder = destinationWeb.GetFolder(dUrl); 

     MoveDocument(sourceFile.ParentFolder, destinationFolder, sourceFile.Name); 
    } 
}

Dans le code ci-dessus, si je tente d'initialiser un SPFolder qui se trouve dans un autre site que le site source, il échoue parce que SharePoint tente de regarder dans le même site que SourceSite plutôt que destinationSite.

L'intention est de pouvoir fournir la possibilité de déplacer un fichier d'une bibliothèque de documents à une autre (que ce soit dans la même collection de sites ou non).

Qu'est-ce que je fais mal?

Répondre

4

Vous utilisez la même URL pour ouvrir votre SPSites

using (SPSite sourceSite = new SPSite(sUrl)) 
using (SPSite destinationSite = new SPSite(sUrl)) 

Avez-vous essayé l'article MSDN? http://msdn.microsoft.com/en-us/library/ms470176.aspx

+0

WTF! Ceci est classé dans la catégorie "Je suis un idiot complet"! Je vous remercie! – senfo

+1

Le tout premier exemple de Microsoft sur cette page fuit la collection de sites en combinant deux types jetables en un seul appel. Je viens de soumettre le contenu de la communauté pour le mentionner. –

+0

@Jesse - très bon point et merci de soumettre le contenu à MSDN, il nous aide tous à un moment ou un autre @senfo - Il est toujours bon d'avoir une deuxième paire d'yeux sur notre code! –

2

En plus de la bonne réponse ci-dessus, vous devriez certainement être débarrasser de votre SPWeb objets ainsi:

public static void MoveDocument(Uri sourceUrl, Uri destinationUrl) 
{ 
    string sUrl = sourceUrl.ToString(); 
    string dUrl = destinationUrl.ToString(); 

    using (SPSite sourceSite = new SPSite(sUrl)) 
    using (SPSite destinationSite = new SPSite(dUrl)) 
    using (SPWeb sourceWeb = sourceSite.OpenWeb()) 
    using (SPWeb destinationWeb = destinationSite.OpenWeb()) 
    { 
     SPFile sourceFile = sourceWeb.GetFile(sUrl); 
     SPFolder destinationFolder = destinationWeb.GetFolder(dUrl); 

     MoveDocument(sourceFile.ParentFolder, destinationFolder, sourceFile.Name); 
    } 
} 
+0

Bien repéré sur ces fuites - il est toujours utile de lancer SPDisposeCheck http://code.msdn.microsoft.com/SPDisposeCheck –

Questions connexes