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.
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
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
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