Condividi tramite


ASP.NET distribuzione Web con Visual Studio: trasformazioni di file Web.config

di Tom Dykstra

Scaricare il progetto iniziale

Questa serie di esercitazioni illustra come distribuire (pubblicare) un'applicazione Web ASP.NET in app Azure Service App Web o in un provider di hosting di terze parti usando Visual Studio 2012 o Visual Studio 2010. Per informazioni sulla serie, vedere la prima esercitazione della serie.

Panoramica

Questa esercitazione illustra come automatizzare il processo di modifica del file Web.config quando viene distribuito in ambienti di destinazione diversi. La maggior parte delle applicazioni ha impostazioni nel file Web.config che devono essere diverse quando l'applicazione viene distribuita. L'automazione del processo di esecuzione di queste modifiche impedisce di doverle eseguire manualmente ogni volta che si distribuisce, che sarebbe noioso e soggetto a errori.

Promemoria: se viene visualizzato un messaggio di errore o qualcosa non funziona durante l'esercitazione, assicurarsi di controllare la pagina di risoluzione dei problemi.

Trasformazioni Web.config e parametri distribuzione Web

Esistono due modi per automatizzare il processo di modifica delle impostazioni del file Web.config : trasformazioni Web.config e parametri distribuzione Web. Un file di trasformazione Web.config contiene markup XML che specifica come modificare il file Web.config quando viene distribuito. È possibile specificare modifiche diverse per configurazioni di compilazione specifiche e per profili di pubblicazione specifici. Le configurazioni di compilazione predefinite sono Debug e Release ed è possibile creare configurazioni di compilazione personalizzate. Un profilo di pubblicazione corrisponde in genere a un ambiente di destinazione. Altre informazioni sui profili di pubblicazione sono disponibili in Esercitazione sulla distribuzione in IIS come ambiente di test.

I parametri distribuzione Web possono essere usati per specificare molti tipi diversi di impostazioni che devono essere configurati durante la distribuzione, incluse le impostazioni disponibili nei file Web.config . Se usato per specificare le modifiche al file Web.config , i parametri di distribuzione Web sono più complessi da configurare, ma sono utili quando non si conosce il valore da impostare fino alla distribuzione. Ad esempio, in un ambiente aziendale, è possibile creare un pacchetto di distribuzione e assegnarlo a una persona del reparto IT da installare nell'ambiente di produzione e tale persona deve essere in grado di immettere stringa di connessione o password che non si conoscono.

Per lo scenario illustrato in questa serie di esercitazioni, si sa in anticipo tutto ciò che deve essere eseguito nel file Web.config , quindi non è necessario usare i parametri Distribuzione Web. Verranno configurate alcune trasformazioni diverse a seconda della configurazione di compilazione usata e alcune che differiscono a seconda del profilo di pubblicazione usato.

Specifica delle impostazioni Web.config in Azure

Se le impostazioni del file Web.config che si desidera modificare si trovano nell'elemento <appSettings> <connectionStrings> o e se si esegue la distribuzione in App Web nel servizio app Azure, è disponibile un'altra opzione per automatizzare le modifiche durante la distribuzione. È possibile immettere le impostazioni che si desidera rendere effettive in Azure nella scheda Configura della pagina del portale di gestione per l'app Web (scorrere verso il basso fino alle sezioni impostazioni dell'app e stringa di connessione). Quando si distribuisce il progetto, Azure applica automaticamente le modifiche. Per altre informazioni, vedere Siti Web di Windows Azure: funzionamento delle stringhe dell'applicazione e delle stringhe di connessione.

File di trasformazione predefiniti

In Esplora soluzioni espandere Web.config per visualizzare i file di trasformazione Web.Debug.config e Web.Release.config creati per impostazione predefinita per le due configurazioni di compilazione predefinite.

Web.config_transform_files

È possibile creare file di trasformazione per configurazioni di compilazione personalizzate facendo clic con il pulsante destro del mouse sul file Web.config e scegliendo Aggiungi trasformazioni di configurazione dal menu di scelta rapida. Per questa esercitazione non è necessario eseguire questa operazione e l'opzione di menu è disabilitata, perché non sono state create configurazioni di compilazione personalizzate.

Successivamente si creeranno altri tre file di trasformazione, uno per i profili di pubblicazione di test, gestione temporanea e produzione. Un esempio tipico di un'impostazione gestita in un file di trasformazione del profilo di pubblicazione perché dipende dall'ambiente di destinazione è un endpoint WCF diverso per il test rispetto all'ambiente di produzione. I file di trasformazione del profilo verranno creati nelle esercitazioni successive dopo aver creato i profili di pubblicazione con cui vengono usati.

Disabilitare la modalità di debug

Un esempio di impostazione che dipende dalla configurazione di compilazione anziché dall'ambiente di destinazione è l'attributo debug . Per una build di versione, in genere si vuole disabilitare il debug indipendentemente dall'ambiente in cui si esegue la distribuzione. Pertanto, per impostazione predefinita, i modelli di progetto di Visual Studio creano file di trasformazione Web.Release.config con codice che rimuove l'attributo debug dall'elemento compilation . Di seguito è riportato il file Web.Release.config predefinito: oltre a un codice di trasformazione di esempio impostato come commento, include il codice nell'elemento che rimuove l'attributo compilation debug:

<?xml version="1.0" encoding="utf-8"?>

<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an attribute "name" that has a value of "MyDB".
    
    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.
      
      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration>

L'attributo xdt:Transform="RemoveAttributes(debug)" specifica che si vuole rimuovere l'attributo debug dall'elemento system.web/compilation nel file Web.config distribuito. Questa operazione verrà eseguita ogni volta che si distribuisce una build di rilascio.

Limitare l'accesso al log degli errori agli amministratori

Se si verifica un errore durante l'esecuzione dell'applicazione, l'applicazione visualizza una pagina di errore generica al posto della pagina di errore generata dal sistema e usa il pacchetto NuGet Elmah per la registrazione e la segnalazione degli errori. L'elemento customErrors nel file Web.config dell'applicazione specifica la pagina di errore:

<customErrors mode="RemoteOnly" defaultRedirect="~/GenericErrorPage.aspx">
  <error statusCode="404" redirect="~/GenericErrorPage.aspx" />
</customErrors>

Per visualizzare la pagina degli errori, modificare temporaneamente l'attributo mode dell'elemento customErrors da "RemoteOnly" a "Sì" ed eseguire l'applicazione da Visual Studio. Causare un errore richiedendo un URL non valido, ad esempio Studentsxxx.aspx. Anziché la pagina di errore "Impossibile trovare la risorsa" generata da IIS, viene visualizzata la pagina GenericErrorPage.aspx .

Pagina di errore

Per visualizzare il log degli errori, sostituire tutti gli elementi nell'URL dopo il numero di porta con elmah.axd (ad esempio, http://localhost:51130/elmah.axd) e premere INVIO:

Pagina ELMAH

Non dimenticare di impostare di nuovo l'elemento sulla customErrors modalità "RemoteOnly" al termine.

Nel computer di sviluppo è utile consentire l'accesso gratuito alla pagina del log degli errori, ma nell'ambiente di produzione si tratta di un rischio per la sicurezza. Per il sito di produzione, si vuole aggiungere una regola di autorizzazione che limita l'accesso al log degli errori agli amministratori e per assicurarsi che la restrizione funzioni anche nel test e nella gestione temporanea. Si tratta quindi di un'altra modifica che si vuole implementare ogni volta che si distribuisce una build di rilascio e quindi appartiene al file Web.Release.config .

Aprire Web.Release.config e aggiungere un nuovo location elemento immediatamente prima del tag di chiusura configuration , come illustrato di seguito.

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an attribute "name" that has a value of "MyDB".
    
    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.
      
      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
  <location path="elmah.axd" xdt:Transform="Insert">
    <system.web>
      <authorization>
        <allow roles="Administrator" />
        <deny users="*" />
      </authorization>
    </system.web>
  </location>
</configuration>

Il Transform valore dell'attributo "Insert" determina l'aggiunta di questo location elemento come elemento di pari livello a qualsiasi elemento esistente location nel file Web.config . Esiste già un location elemento che specifica le regole di autorizzazione per la pagina Update Credits .)

È ora possibile visualizzare in anteprima la trasformazione per assicurarsi che sia stata codificata correttamente.

In Esplora soluzioni fare clic con il pulsante destro del mouse su Web.Release.config e scegliere Anteprima trasformazione.

Menu Anteprima trasformazione

Viene visualizzata una pagina che mostra il file Web.config di sviluppo a sinistra e l'aspetto del file Web.config distribuito a destra, con le modifiche evidenziate.

Anteprima della trasformazione di debug

Screenshot che mostra l'anteprima web.config con il file di sviluppo a sinistra e l'aspetto del file distribuito a destra con le modifiche evidenziate.

( Nell'anteprima è possibile notare alcune modifiche aggiuntive per cui non sono state scritte trasformazioni: in genere comportano la rimozione di spazi vuoti che non influiscono sulle funzionalità.

Quando si testa il sito dopo la distribuzione, si verificherà anche che la regola di autorizzazione sia valida.

Nota

Nota sulla sicurezza Non visualizzare mai i dettagli degli errori al pubblico in un'applicazione di produzione o archiviare tali informazioni in una posizione pubblica. Gli utenti malintenzionati possono usare le informazioni sugli errori per individuare le vulnerabilità in un sito. Se si usa ELMAH nella propria applicazione, configurare ELMAH per ridurre al minimo i rischi per la sicurezza. L'esempio ELMAH in questa esercitazione non deve essere considerato una configurazione consigliata. È un esempio scelto per illustrare come gestire una cartella in cui l'applicazione deve essere in grado di creare file. Per altre informazioni, vedere Protezione dell'endpoint ELMAH.

Un'impostazione che verrà gestita nei file di trasformazione del profilo di pubblicazione

Uno scenario comune consiste nell'avere impostazioni del file Web.config che devono essere diverse in ogni ambiente in cui viene eseguita la distribuzione. Ad esempio, un'applicazione che chiama un servizio WCF potrebbe richiedere un endpoint diverso in ambienti di test e produzione. L'applicazione Contoso University include anche un'impostazione di questo tipo. Questa impostazione controlla un indicatore visibile nelle pagine di un sito che indica l'ambiente in cui ci si trova, ad esempio sviluppo, test o produzione. Il valore dell'impostazione determina se l'applicazione aggiungerà "(Dev)" o "(Test)" all'intestazione principale nella pagina master Site.Master :

Indicatore dell'ambiente

L'indicatore di ambiente viene omesso quando l'applicazione è in esecuzione in staging o produzione.

Le pagine Web di Contoso University leggono un valore impostato nel appSettings file Web.config per determinare l'ambiente in cui è in esecuzione l'applicazione:

<appSettings>
    <add key="Environment" value="Dev" />
</appSettings>

Il valore deve essere "Test" nell'ambiente di test e "Prod" per la gestione temporanea e la produzione.

Il codice seguente in un file di trasformazione implementerà questa trasformazione:

<appSettings>
    <add key="Environment" value="Test" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>

Il xdt:Transform valore dell'attributo "SetAttributes" indica che lo scopo di questa trasformazione è modificare i valori di attributo di un elemento esistente nel file Web.config . Il xdt:Locator valore dell'attributo "Match(key)" indica che l'elemento da modificare è quello il cui key attributo corrisponde all'attributo key specificato qui. L'unico attributo dell'elemento add è valuee questo è ciò che verrà modificato nel file Web.config distribuito. Il codice illustrato di seguito determina l'impostazione dell'attributo dell'elemento appSettings Environment su "Test" nel file Web.config distribuito.value

Questa trasformazione appartiene ai file di trasformazione del profilo di pubblicazione, che non sono ancora stati creati. Si creeranno e aggiorneranno i file di trasformazione che implementano questa modifica quando si creano i profili di pubblicazione per gli ambienti di test, gestione temporanea e produzione. A tale scopo, nella distribuzione in IIS e si eseguirà la distribuzione nelle esercitazioni di produzione.

Nota

Poiché questa impostazione si trova nell'elemento <appSettings> , è disponibile un'altra alternativa per specificare la trasformazione quando si esegue la distribuzione in App Web nel servizio app Azure vedere Specifica delle impostazioni Web.config in Azure più indietro in questo argomento.

Impostazione delle stringhe di connessione

Anche se il file di trasformazione predefinito contiene un esempio che illustra come aggiornare un stringa di connessione, nella maggior parte dei casi non è necessario configurare le trasformazioni stringa di connessione, perché è possibile specificare stringa di connessione nel profilo di pubblicazione. A tale scopo, nella distribuzione in IIS e si eseguirà la distribuzione nelle esercitazioni di produzione.

Riepilogo

Sono state eseguite tutte le operazioni che è possibile eseguire con le trasformazioni Web.config prima di creare i profili di pubblicazione ed è stata visualizzata un'anteprima di ciò che verrà visualizzato nel file Web.config distribuito.

Screenshot che mostra l'anteprima web.config con il file Web.config originale a sinistra e l'aspetto del file Web.config trasformato a destra con le modifiche evidenziate.

Nell'esercitazione seguente si esamineranno le attività di configurazione della distribuzione che richiedono l'impostazione delle proprietà del progetto.

Ulteriori informazioni

Per altre informazioni sugli argomenti trattati in questa esercitazione, vedere Uso delle trasformazioni Web.config per modificare le impostazioni nel file Web.config di destinazione o nel file app.config durante la distribuzione nella mappa del contenuto della distribuzione Web per Visual Studio e ASP.NET.