2008-12-09 11 views
2

Ceci est une question pour un gourou WSS/SharePoint.Comment créer un chemin géré via un modèle d'objet SharePoint

Considérez ce scénario: J'ai un service Web ASP.Net qui relie notre système CRM d'entreprise et intranet WSS ensemble. Ce que j'essaie de faire est de fournir une nouvelle collection de sites WSS chaque fois qu'un nouveau client est ajouté au système CRM. Pour que cela fonctionne, je dois ajouter par programme le chemin géré à la nouvelle collection de sites. Je sais que c'est possible via le modèle objet, mais quand je l'essaye dans mon propre service web, ça échoue. extrait de code de l'échantillon ci-dessous:


Dim _ClientSiteUrl As String = "http://myintranet/clients/sampleclient" 

     Using _RootWeb As SPSite = New SPSite("http://myintranet") 

      Dim _ManagedPaths As SPPrefixCollection = _RootWeb.WebApplication.Prefixes 

      If Not (_ManagedPaths.Contains(_ClientSiteUrl)) Then 

       _ManagedPaths.Add(_ClientSiteUrl, SPPrefixType.ExplicitInclusion) 

      End If 

     End Using 
 

Ce code échoue avec une NullReferenceException sur SPUtility.ValidateFormDigest(). La recherche a suggéré que cela peut être dû à des privilèges insuffisants, j'ai essayé d'exécuter le code dans un bloc de privilèges élevés en utilisant SPSecurity.RunWithElevatedPrivileges (AddressOf AddManagedPath), où AddManagedPath est une procédure Sub contenant l'exemple de code ci-dessus.

Cela échoue alors avec une exception InvalidOperationException, "opération n'est pas valide en raison de l'état actuel de l'objet".

Où est-ce que je me trompe?

Une solution de contournement que j'ai réussi à faire est d'appeler STSADM.EXE via Process.Start(), en fournissant les paramètres requis, et cela fonctionne.

Mise à jour: Lors du développement du service Web, je l'utilise en utilisant le serveur Web Visual Studio 2005 intégré - quel contexte de sécurité sera utilisé? Puis-je changer le contexte de sécurité en mettant des entrées dans web.config?

Mise à jour: Je pense que le problème est définitivement de ne pas exécuter le service Web dans le bon contexte de sécurité SharePoint. J'ai décidé d'utiliser la solution de contournement proposée et de débourser vers STSADM, bien que pour ce faire, l'identité du pool d'applications sous lequel le service Web s'exécute doit être membre des administrateurs SharePoint.

Répondre

1

Mise à jour Je pense que vous avez prouvé que le problème n'est pas avec le code.

SPSecurity.RunWithElevatedPrivileges: Normalement, le code de l'application Web SharePoint s'exécute avec les privilèges de l'utilisateur effectuant l'action. Le RunWithElevatedPrivileges exécute le code dans le contexte du compte de pools d'applications Web SharePoint (je pense) La description sur MSDN pourrait aller dans les détails un peu plus. Le problème avec l'appel peut être que le service Web n'exécute pas réellement le code dans un processus SharePoint, expliquant ainsi pourquoi il ne peut pas élever (wild guess guess). Avoir une chance de changer l'utilisateur de votre pool d'applications de services Web et voir si cela donne de la joie.


Il s'agit probablement d'un problème lié aux autorisations. Peut-être essayer:

Dim clientSiteUrl As String = "http://myintranet/clients/sampleclient" 
Using SPSite = new SPSite(clientSiteUrl) 
    webApp As SPWebApplication = SPWebApplication.Lookup(new Uri(clientSiteUrl)); 
    If Not (webApp.Prefixes.Contains(clientSiteUrl)) Then 
     webApp.Prefixes.Add(clientSiteUrl, SPPrefixType.ExplicitInclusion) 
    End If 
End Using 

Ce n'est pas le code exact.

+0

SPWebApplication ne met pas en œuvre IDisposable, de sorte que vous ne pouvez pas utiliser l'aide/Fin En utilisant la construction. Utilisez simplement Dim à la place. – Jazza

+0

La méthode SPWebApplication.Lookup accepte un Uri absolu (http: // myintranet/clients/sampleclient), mais pour ajouter un chemin géré, vous avez besoin de l'Uri relatif (clients/sampleclient). – Jazza

+0

Nat - même après quelques modifications de code mineures (voir les commentaires ci-dessus), j'ai toujours la même erreur de validation. D'autres suggestions? – Jazza

1

Étant donné que le code ci-dessus n'est pas le code exact, voici le code de travail exact pour une fonctionnalité d'application Web scopped dans la fonction événement Activé:

Lors de l'activation des fonctionnalités les caractéristiques d'application web Mange la page, activez fonctionnalité créer un nouveau chemin d'accès géré explicite dans l'application Web spécifiée (je veux remplacer le codage en dur, peut-être avec Properties.Feature.Parent, ou quelque chose de similaire.)

using (SPSite site = new SPSite("http://dev-moss07-eric/PathHere")) { 
    SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://dev-moss07-eric")); 
    if (webApp.Prefixes.Contains("PathHere")) 
    { 
     // 
    } 
    else 
    { 
     webApp.Prefixes.Add("PathHere", SPPrefixType.ExplicitInclusion); 
    } 
} 

code peut sans doute être améliorée, mais sa ma tentative à la conversion du code ci-dessus.

0

Si vous voulez créer un chemin d'accès géré (explicite) et une collection de sites à ce chemin, procédez comme suit:

using (SPSite site = new SPSite("http://dev-moss07-eric")) { 
       SPWebApplication webApp = SPWebApplication.Lookup(new Uri("http://dev-moss07-eric")); 
       if (webApp.Prefixes.Contains("ManagedPathHere")) 
       { 
        // 
       } 
       else 
       { 
        webApp.Prefixes.Add("ManagedPathHere", SPPrefixType.ExplicitInclusion); 
       } 
       using (SPWeb web = site.OpenWeb()) 
       { 
        SPWebApplication webApplication = web.Site.WebApplication; 
        try 
        { 
         webApplication.Sites.Add("ManagedPathHere","Site Title Here","This site is used for hosting styling assets.", 1033, "STS#1", "6scdev\\eric.schrader", "Eric Schrader", "[email protected]"); 
        } 
        catch (Exception ex) 
        { 
         //ex.ToString; 
        } 
       } 
      } 
+0

Merci Eric. Je ne suis pas en mesure de tester cela maintenant, car cela fait un certain temps que j'ai posté la question. – Jazza

Questions connexes