Domanda

Questa è una domanda per un guru WSS / SharePoint.

Considera questo scenario: ho un servizio web ASP.Net che collega insieme il nostro sistema CRM aziendale e la intranet basata su WSS. Quello che sto cercando di fare è eseguire il provisioning di una nuova raccolta siti WSS ogni volta che un nuovo client viene aggiunto al sistema CRM. Per farlo funzionare, devo aggiungere a livello di programmazione il percorso gestito alla nuova raccolta siti. So che questo è possibile tramite il modello a oggetti, ma quando lo provo nel mio servizio web, non riesce. Estratto di codice di esempio di seguito:


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

Questo codice ha esito negativo con NullReferenceException su SPUtility.ValidateFormDigest (). La ricerca ha suggerito che ciò potrebbe essere dovuto a privilegi insufficienti, ho provato a eseguire il codice all'interno di un blocco di privilegi elevati utilizzando SPSecurity.RunWithElevatedPrivileges (AddressOf AddManagedPath), dove AddManagedPath è una procedura secondaria contenente l'esempio di codice sopra riportato.

Ciò non riesce quindi con InvalidOperationException, " Operazione non valida a causa dello stato corrente dell'oggetto. "

Dove sbaglio?

Una soluzione alternativa che sono riuscito a fare è quella di chiamare STSADM.EXE tramite Process.Start (), fornendo i parametri richiesti, e questo funziona.

Aggiornamento: durante lo sviluppo del servizio Web, lo eseguo utilizzando il server Web di Visual Studio 2005 incorporato: in quale contesto di sicurezza verrà eseguito? Posso cambiare il contesto di sicurezza inserendo voci in web.config?

Aggiornamento: penso che il problema abbia sicuramente a che fare con la mancata esecuzione del servizio Web nel corretto contesto di sicurezza di SharePoint. Ho deciso di seguire la soluzione che ho suggerito e passare a STSADM, anche se per fare ciò, l'identità del pool di applicazioni in cui viene eseguito il servizio Web deve essere un membro degli amministratori di SharePoint.

È stato utile?

Soluzione

Aggiorna Penso che tu abbia dimostrato che il problema non riguarda il codice.

SPSecurity.RunWithElevatedPrivileges: normalmente il codice nell'applicazione Web di SharePoint viene eseguito con i privilegi dell'utente che esegue l'azione. RunWithElevatedPrivileges esegue il codice nel contesto dell'account dei pool di applicazioni Web di SharePoint (credo) La descrizione su MSDN potrebbe andare nel dettagli un po 'di più.

Il problema con la chiamata potrebbe essere che il servizio Web non sta effettivamente eseguendo il codice all'interno di un processo di SharePoint, spiegando quindi perché non può elevarsi (avviso di ipotesi selvaggio).

Prova a cambiare l'utente del tuo pool di applicazioni dei servizi web e vedi se questo dà gioia.


È probabile che si tratti di un problema di autorizzazioni. Forse prova:

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

Questo non è un codice esatto.

Altri suggerimenti

Poiché il codice sopra riportato non è il codice esatto, ecco il codice di lavoro esatto per una funzionalità scartata dall'applicazione Web nell'evento Feature Activated:

All'attivazione della funzione nella pagina delle funzionalità dell'applicazione Web Mange, la funzione di attivazione creerà un nuovo percorso gestito esplicito nell'applicazione Web specificata (voglio sostituire la codifica hardware, magari con Properties.Feature.Parent o qualcosa di simile).

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

Il codice può probabilmente essere migliorato, ma è il mio tentativo di convertire il codice sopra.

Se si desidera creare un percorso gestito (esplicito) e una raccolta siti in quel percorso, procedere come segue:

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;
                    }
                }
            }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top