Pregunta

Esta es una pregunta para un gurú de WSS / SharePoint.

Considere este escenario: tengo un servicio web ASP.Net que vincula nuestro sistema CRM corporativo y la intranet basada en WSS. Lo que intento hacer es aprovisionar una nueva colección de sitios WSS cada vez que se agrega un nuevo cliente al sistema CRM. Para que esto funcione, necesito agregar mediante programación la ruta administrada a la nueva colección de sitios. Sé que esto es posible a través del Modelo de Objetos, pero cuando lo pruebo en mi propio servicio web, falla. Ejemplo de extracto de código a continuación:


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

Este código falla con una NullReferenceException en SPUtility.ValidateFormDigest (). La investigación sugirió que esto puede deberse a privilegios insuficientes, intenté ejecutar el código dentro de un bloque de privilegios elevados usando SPSecurity.RunWithElevatedPrivileges (AddressOf AddManagedPath), donde AddManagedPath es un procedimiento Sub que contiene el ejemplo de código anterior.

Esto entonces falla con una InvalidOperationException, " La operación no es válida debido al estado actual del objeto. "

¿Dónde me estoy equivocando?

Una solución alternativa que he logrado hacer es llamar a STSADM.EXE a través de Process.Start (), proporcionando los parámetros necesarios, y esto funciona.

Actualización: mientras desarrollo el servicio web, lo ejecuto utilizando el servidor web Visual Studio 2005 incorporado. ¿En qué contexto de seguridad se ejecutará? ¿Puedo cambiar el contexto de seguridad colocando entradas en web.config?

Actualización: creo que el problema definitivamente tiene que ver con no ejecutar el servicio web dentro del contexto de seguridad de SharePoint correcto. Decidí seguir la solución que sugerí y utilizar STSADM, aunque para hacer esto, la identidad del grupo de aplicaciones con la que se ejecuta el servicio web debe ser miembro de los administradores de SharePoint.

¿Fue útil?

Solución

Actualizar Creo que ha demostrado que el problema no está en el código.

SPSecurity.RunWithElevatedPrivileges: normalmente, el código en la aplicación web de SharePoint se ejecuta con los privilegios del usuario que realiza la acción. RunWithElevatedPrivileges ejecuta el código en el contexto de la cuenta de grupos de aplicaciones web de SharePoint (creo) La descripción en MSDN podría entrar en detalles un poquito más.

El problema con la llamada puede ser que el servicio web en realidad no está ejecutando el código dentro de un proceso de SharePoint, por lo que explica por qué no puede elevarse (alerta de conjetura salvaje).

Diviértase cambiando el usuario de su grupo de aplicaciones de servicios web y vea si eso le da alegría.


Es probable que sea un problema de permisos. Tal vez intente:

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

Este no es el código exacto.

Otros consejos

Dado que el código anterior no es el código exacto, aquí está el código de trabajo exacto para una función de ámbito de aplicación web en el evento de función activada:

Al activar la función en la página de funciones de la aplicación web Mange, la función de activación creará una nueva ruta explícita administrada en la aplicación web especificada (quiero reemplazar la codificación rígida, tal vez con Properties.Feature.Parent, o algo similar).

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);
    }
}

El código probablemente se puede mejorar, pero es mi intento de convertir el código anterior.

Si desea crear una ruta administrada (explícita) y una colección de sitios en esa ruta, haga lo siguiente:

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", "eric.schrader@6sc.com");
                    }
                    catch (Exception ex)
                    {
                        //ex.ToString;
                    }
                }
            }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top