2010-03-18 15 views
0

J'ai une liste d'URLs (URL de type de contenu). Maintenant, les types de contenu sont déployés sur le Web. Je dois boucler ces types de contenu et faire des actions dans chaque liste, mais l'ouverture d'une nouvelle instance SPWeb à chaque boucle est trop gourmande en ressources.Existe-t-il une méthode intégrée pour indiquer si une URL spécifique appartient à ce SPWeb ou à un autre SPWeb?

Y a-t-il une méthode intégrée pour me dire si cette URL appartient à certains objets SPWeb?

Exemple:

SPWeb peuvent être de

W ITH liens d'utilisation du type de contenu comme:

  • /Web2/Pages
  • /Web2/Listes/Tâches
  • /web2/Listes/Documents
  • /web2/subweb1/Listes/tâches
  • . ..

Comme vous pouvez le voir, pour les 3 premiers usages je ne ai pas besoin d'ouvrir de nouveaux SPWeb

Répondre

2

Juste une supposition, mais peut-être qu'il vaut la peine d'essayer SPWeb.GetList(serverRelativeUrl) sur les instants SPWeb que vous avez déjà et, si aucun ne correspond, alors créer un nouveau SPWeb?

Mise à jour: une autre idée. En supposant que tous les SPWebs vivent dans le même SPSite, vous pouvez également utiliser this particular overload of SPSite.OpenWeb() (et définir l'indicateur requestExactUrl sur false). Cela vous renverra l'objet SPWeb dont vous avez besoin. En interne, les objets SPWeb ouverts sont réutilisés (que vous pouvez voir dans la méthode SPWeb.SPWebConstructor dans Reflector), ce qui ne gêne pas trop les performances. faux, les objets SPweb sont simplement stockés dans une liste, pas réutilisés.

+0

Je pense que c'est une solution simple - essayez avec la méthode GetList, si elle n'est pas satisfaisante, alors j'utiliserai OpenWeb(). Merci. –

0

Pour autant que je sache, il n'y a pas de méthode intégrée pour ce genre de chose.
Je vous suggère de créer une méthode d'extension SPWeb pour cela.

Voici un extrait de code pour vous aider à démarrer (non testé 100%):

public static class SPWebExtensions 
{ 
    public static bool UrlBelongsToweb(this SPWeb web, string url) 
    { 
    Uri uriWeb = new Uri(web.Url); 

    if (uriWeb.LocalPath.ToLower() == url.ToLower()) 
     return true; 

    if (!url.ToLower().StartsWith(uriWeb.LocalPath.ToLower())) 
     return false; 

    foreach (SPWeb subWeb in web.Webs) 
    { 
     Uri uriSub = new Uri(subWeb.Url); 
     if (url.ToLower().StartsWith(uriSub.LocalPath.ToLower())) 
     return false; 

     subWeb.Dispose(); 
    } 
    return true; 
    } 
} 

On peut l'utiliser dans quelque chose comme ceci:

bool urlBelongsToWeb = web.UrlBelongsToweb("/web2/Lists/Documents"); 

Où web est votre objet SPWeb courant.

Si vous souhaitez cibler des listes spécifiques dans votre SiteCollection, utilisez le SPSiteDataQuery pour les récupérer et effectuer votre travail magique contre eux.

+0

Merci pour l'extrait. Mais ce ne sera pas bon pour moi, car cela implique de boucler à travers des sous-réseaux, ce qui est un gros coup de performance. Et tout ce que je veux savoir est - dois-je ouvrir un nouveau SPWeb ou non? La méthode involes ouvre de nouveaux SPWeb beaucoup plus de fois. Par ailleurs, avant que quelqu'un copie la méthode, dipose subWeb correctement dans le bloc finally. –

+0

@Janis. Merci pour la capture, code mis à jour. –

+0

@Janis. Qu'en est-il de SPSiteDataQuery pour obtenir les listes en question? Ou, si les performances vous intéressent, interrogez SiteMap pour déterminer si les URL de test sont des sites Web ou des listes. Est-ce une tâche répétitive, ou un one-shot? –

1

Dans quel contexte votre code sera exécuté? Ce que je veux dire, c'est que vous voulez écrire du code qui sera exécuté dans le cadre d'un processus de déploiement, ce qui signifie qu'il ne sera exécuté que de temps en temps.

Si tel est le cas, est-ce important ou non que votre code soit optimisé pour les performances? À mon avis, il pourrait être préférable de s'en tenir à une solution simple d'ouverture de chaque SPWeb et ne pas trop se soucier de la performance.

Si vous devez parcourir des centaines ou des milliers de sites, cela prendra du temps. Si votre code prend dix minutes pour le faire, ou quinze, ne devrait pas vraiment d'importance.

Les performances seraient plus un problème si cela devait être exécuté de nombreuses fois, et souvent.

+0

Oui, c'est pour le processus de déploiement. Désolé, dans ce cas, il semble que ce n'est pas grave, vous avez raison. –