Domanda

Faccio parte di un team che sviluppa un "portale" per SharePoint Foundation 2010.Sono responsabile della creazione del programma di installazione che configura una nuova istanza di SharePoint.Gestisce molto più della semplice installazione dei file della soluzione e della configurazione di SharePoint.Il programma di installazione gestisce la distribuzione dei file nel GAC e la creazione del nostro client di sicurezza federato (utilizzato per l'autenticazione basata sulle attestazioni di SharePoint).

Durante l'installazione di un'istanza, completo alcune attività specificamente correlate a SharePoint e utilizzo l'API SharePoint in .NET 3.5:

  1. Crea/Configura la fiducia
  2. Creare un'applicazione web.
  3. Distribuire soluzioni alla farm e all'applicazione Web
  4. Crea raccolta siti predefinita
  5. Attiva le funzionalità predefinite nella raccolta siti
  6. Aggiornare le "proprietà" dell'applicazione web

Finora sono riuscito a far funzionare correttamente l'installazione su un singolo server SharePoint, ovvero un server ospita il database della farm e un altro è lo stack completo di servizi SharePoint.Ho iniziato a testare una configurazione che imiterà la configurazione reale di SharePoint nel nostro ambiente di hosting.Lì abbiamo un server database e almeno tre server SharePoint, solo uno dei quali ha Amministrazione centrale.

Il problema che ho riscontrato è che in questo caso posso eseguire correttamente e senza errori tutti i passaggi precedenti tranne l'attivazione delle funzionalità.Ho rimosso il codice che esegue questo passaggio e verificato che l'applicazione Web, la raccolta siti, l'attendibilità, ecc. (ad eccezione delle "proprietà") siano stati creati correttamente avviando il sito, effettuando l'autenticazione e visualizzando il tema "team" predefinito .Tuttavia, una volta attivate le funzionalità predefinite, tramite API o tramite le impostazioni della raccolta siti, non riesco più ad accedere al sito e ricevo un errore.

Questo arriva al nocciolo del mio problema e al problema che devo affrontare quando lo spiego qui.La nostra soluzione è estremamente complessa in quanto comporta numerose configurazioni dagli aspetti di sicurezza e dal ricorso ad altri servizi esterni a SharePoint.Non so se alcune delle nostre impostazioni non si propagano attraverso i server causando un errore interno nella nostra soluzione che causa la pagina di errore.Inoltre non so se quando imposto le "proprietà" si mantengono nella situazione farm.Ho riscontrato un problema in cui non li impostavo correttamente quando ho iniziato questa attività e ciò ha causato un problema simile a quello che vedo ora.

Inoltre, non sono sicuro che le soluzioni vengano distribuite correttamente, danneggiandone quindi le funzionalità.Ho configurato il visualizzatore ULS su ciascuno dei server SharePoint ma non riesco a trovare nulla relativo all'ID di correlazione per l'errore che ricevo nella pagina di errore.In realtà non ricevo eventi nel visualizzatore ULS sul server SharePoint "master".Posso vedere la distribuzione e la ritirata delle soluzioni nel visualizzatore sugli altri due server.

Devo perdere qualcosa che accade in una farm con più server.Spero che qualcuno possa dare un'occhiata al pezzo di codice che utilizzo per distribuire soluzioni e impostare proprietà per aiutarmi.Vorrei anche davvero capire perché non riesco a vedere l'errore che ricevo in nessuno dei visualizzatori ULS.Qualcuno può spiegarmelo?

Inoltre sto cercando esempi più definitivi su come configurare e impostare SharePoint tramite l'API C#.Fino a questo punto ho decompilato il codice per i commandlet e replicato ciò che potevo nel codice.Non ho ancora un modo "corretto" per attivare una funzionalità tramite C# e sto semplicemente creando un processo che esegue stsadm.exe per attivare le funzionalità.

Ecco il mio codice per aggiungere e distribuire una soluzione:

      SPSolution newSolution = SPFarm.Local.Solutions.Add(Path.Combine(this.SharePointPointRootFolder, solutionDefinition.filename));

      if (!solutionDefinition.webApplicationSpecific)
      {
        Console.WriteLine("Adding a farm specific solution.");

        newSolution.Deploy(DateTime.Now, true, true);

        this.WaitForSolutionJobsToComplete(newSolution.Id);

        newSolution.Synchronize();
      }
      else //specific to a web application.  Load the new solution.
      {
        Console.WriteLine("Adding web application specific solution.");

        Collection<SPWebApplication> webAppCol = new Collection<SPWebApplication>();
        webAppCol.Add(this.WebApplication);

        newSolution.Deploy(DateTime.Now, true, webAppCol, true);

        this.WaitForSolutionJobsToComplete(newSolution.Id);

        newSolution = SPFarm.Local.GetObject(newSolution.Id) as SPSolution;

        newSolution.Synchronize();

        this.WaitForSolutionJobsToComplete(newSolution.Id);

        newSolution.Update();
      }

Ecco il mio codice per l'attivazione delle funzionalità.Utilizza semplicemente un processo per utilizzare STSADM.EXE:

void UpdateFeatures(SPSite site)
{
  Console.WriteLine("Updating features.");

  SPSolutionDefinitionCollection collection = SolutionConfigurer.LoadSolutionDefinitions();

  foreach (SPSolutionDefinition solutionDefinition in collection.spSolutionDefinition)
  {

    Guid id = new Guid(solutionDefinition.ID);

    if (solutionDefinition.spFeatureDefinition != null && solutionDefinition.spFeatureDefinition.Length > 0)
    {
      foreach (Models.SPFeatureDefinition fDef in solutionDefinition.spFeatureDefinition)
      {
        Guid fDefId = new Guid(fDef.ID);

        //this.Activate(fDefId, site);

        Process stsadmP = WebApplicationConfigurer.GetSTSADMProcess(this.STSADMPath, "-o activatefeature -id " + fDef.ID + " -url " + this.SiteCollectionUrl + " -force");

        Console.WriteLine(string.Format("Invoking STSADM.EXE for feature deployment: {0} with arguments:{1}", stsadmP.StartInfo.FileName, stsadmP.StartInfo.Arguments));

        stsadmP.Start();
        stsadmP.WaitForExit();

        if (stsadmP.ExitCode == 0)
        {
          Console.WriteLine(string.Format("STSADM.EXE successfully ran for feature id {0} and produced this output: {1}", fDefId, stsadmP.StandardOutput.ReadToEnd()));
        }
        else
        {
          Console.WriteLine(string.Format("STSADM.EXE did not produce a successful exit code for feature id {0} and produced this output: {1} + {2}", fDefId, 
            stsadmP.StandardOutput.ReadToEnd(), stsadmP.StandardError.ReadToEnd()));
        }
      }
    }
  }
}

Ecco come aggiorno una proprietà.Lo faccio per ultimo perché lo stavo facendo dopo aver distribuito le soluzioni, ma sembra che l'attivazione delle funzionalità ripristinasse i valori.

public void UpdatePropertiesWebApplication()
{
  string dnsName = this.SigningCertificate.GetNameInfo(X509NameType.DnsName, false);

  SPWebApplication webApplication = SPFarm.Local.GetObject(this.WebApplicationId) as SPWebApplication;

  if (webApplication != null)
  {
    Console.WriteLine("Updating property information for the web application.");

    if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.ESB_ROOT))
    {
      webApplication.Properties.Add(Constants.PropertyBagKeys.ESB_ROOT, this.ESBUrl);
    }
    else
    {
      Console.WriteLine("Updating ESB Root URL. " + this.ESBUrl);
      webApplication.Properties[Constants.PropertyBagKeys.ESB_ROOT] = this.ESBUrl;
    }

    Console.WriteLine("ESB Root Url: " + webApplication.Properties[Constants.PropertyBagKeys.ESB_ROOT]);

    if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.REALM))
    {
      webApplication.Properties.Add(Constants.PropertyBagKeys.REALM, this.SharePointTrustPoint);
    }
    else
    {
      Console.WriteLine("Updating realm. " + this.SharePointTrustPoint);
      webApplication.Properties[Constants.PropertyBagKeys.REALM] = this.SharePointTrustPoint;
    }

    Console.WriteLine("Realm: " + webApplication.Properties[Constants.PropertyBagKeys.REALM]);

    if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.SSO_ROOT))
    {
      webApplication.Properties.Add(Constants.PropertyBagKeys.SSO_ROOT, this.SSOUrl);
    }
    else
    {
      Console.WriteLine("Updating the broker url. " + this.SSOUrl);
      webApplication.Properties[Constants.PropertyBagKeys.SSO_ROOT] = this.SSOUrl;
    }

    Console.WriteLine("Broker Url: " + webApplication.Properties[Constants.PropertyBagKeys.SSO_ROOT]);

    if (!webApplication.Properties.ContainsKey(Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT))
    {
      webApplication.Properties.Add(Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT, dnsName);
    }
    else
    {
      Console.WriteLine("Updating trusted cert dns identity. " + dnsName);
      webApplication.Properties[Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT] = dnsName;
    }

    Console.WriteLine("Trusted Certificate Identity: " + webApplication.Properties[Constants.PropertyBagKeys.TRUSTED_CERT_DNS_IDENT]);

    webApplication.Update(true);
  }
}
È stato utile?

Soluzione

Per rispondere alla tua domanda generale, il modo consigliato per distribuire la soluzione in SharePoint 2010 consiste nell'utilizzare PowerShell.

Da Cosa c'è di nuovo:Windows PowerShell per SharePoint:

Windows PowerShell sostituisce lo strumento di amministrazione Stsadm.exe.In futuro, sarà necessario utilizzare la tecnologia di scripting di Windows PowerShell per sviluppare nuovi script della riga di comando in SharePoint Foundation 2010.

Ecco alcuni esempi e script per la distribuzione con PowerShell:

Ed ecco le informazioni sull'attivazione delle funzionalità in PowerShell:

Per rispondere alla tua domanda specifica, è possibile attivare una funzionalità in C#:

Guid fDefId = new Guid(fDef.ID);
site.Features.Add(fDefId);

Per ulteriori informazioni, vedere SPSite.Caratteristiche E SPFeatureCollection.Add.

Altri suggerimenti

ad essere totalmente onesto, non vedo più il punto di fare qualcosa nel codice che posso fare direttamente con stsadm.

Quindi utilizzo sempre solo l'equivalente di ciò di cui ho bisogno:

stsadm -o deletesolution -name solution.wsp -override
stsadm -o addsolution -filename c:\path\solution.wsp
stsadm -o deploysolution -name solution.wsp -allowgacdeployment -local -force

Poi...

Attiva funzionalità
Opzioni della soluzione di installazione
Applica il modello principale
Creare siti secondari
Crea elenchi
Aggiungere web part
Imposta le autorizzazioni
Nascondi/Mostra navigazione e colonne
Aggiungi tutti i dati richiesti alla distribuzione
Fine

Ho avuto molti problemi nel tentativo di implementare una soluzione utilizzando il metodo che usi (basta cercare in quello che ho pubblicato qui e non ho trovato soluzioni)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a sharepoint.stackexchange
scroll top