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

di Tom Dykstra

Scaricare il progetto iniziale

Questa serie di esercitazioni illustra come distribuire (pubblicare) un'applicazione Web ASP.NET in Servizio app di Azure 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 nella 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 deve essere diverso quando l'applicazione viene distribuita. L'automazione del processo di apportare queste modifiche impedisce di dover eseguire manualmente le modifiche ogni volta che si distribuisce, che sarebbe noioso e soggetto a errori.

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

trasformazioni Web.config rispetto ai parametri distribuzione Web

Esistono due modi per automatizzare il processo di modifica delle impostazioni dei file Web.config : trasformazioniWeb.config e parametri distribuzione Web. Un file di trasformazioneWeb.config contiene markup XML che specifica come modificare il file diWeb.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 e è possibile creare configurazioni di compilazione personalizzate. Un profilo di pubblicazione corrisponde in genere a un ambiente di destinazione. Altre informazioni sulla pubblicazione dei profili nell'esercitazione Distribuzione in IIS come ambiente di test .

I parametri Di distribuzione Web possono essere usati per specificare molti tipi di impostazioni diversi che devono essere configurati durante la distribuzione, incluse le impostazioni disponibili nei file di Web.config . Quando viene usato per specificare Web.config modifiche ai file, i parametri 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 in produzione e tale persona deve essere in grado di immettere stringhe di connessione o password che non si conosce.

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

Specifica delle impostazioni di Web.config in Azure

Se le impostazioni del fileWeb.config da modificare si trovano nell'elemento <connectionStrings> o nell'elemento e se si esegue la distribuzione in App Web in Servizio app di Azure, è disponibile un'altra opzione per l'automazione <appSettings> delle modifiche durante la distribuzione. È possibile immettere le impostazioni che si desidera applicare in Azure nella scheda Configura portale di gestione per l'app Web (scorrere verso il basso fino alle sezioni impostazioni dell'app e stringhe di connessione ). Quando si distribuisce il progetto, Azure applica automaticamente le modifiche. Per altre informazioni, vedere Siti Web di Windows Azure: modalità di funzionamento delle stringhe di applicazione e 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 tre file di trasformazione, ognuno per i profili di pubblicazione di test, staging 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 alla produzione. Dopo aver creato i profili di pubblicazione, verranno creati i file di trasformazione del profilo 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 compilazione di versione, in genere si vuole disabilitare il debug indipendentemente dall'ambiente in cui si sta distribuendo. Pertanto, per impostazione predefinita, i modelli di progetto di Visual Studio creano file di trasformazioneWeb.Release.config con codice che rimuove l'attributo dall'elemento debugcompilation . Ecco la Web.Release.configpredefinita: oltre a un codice di trasformazione di esempio commentato, include il codice nell'elemento che rimuove l'attributo compilationdebug :

<?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 che l'attributo venga rimosso dall'elemento debugsystem.web/compilation nel file di Web.config distribuito. Questa operazione verrà eseguita ogni volta che si distribuisce una build di versione.

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 degli errori e la segnalazione. L'elemento customErrors nel file diWeb.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 di errore, modificare temporaneamente l'attributo mode dell'elemento customErrors da "RemoteOnly" a "On" ed eseguire l'applicazione da Visual Studio. Causa un errore richiedendo un URL non valido, ad esempio Studentsxxx.aspx. Anziché una pagina di errore generata da IIS "Impossibile trovare la risorsa", viene visualizzata la pagina GenericErrorPage.aspx .

Pagina errore

Per visualizzare il log degli errori, sostituire tutto 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 customErrors in modalità "RemoteOnly" al termine.

Nel computer di sviluppo è utile consentire l'accesso gratuito alla pagina del log degli errori, ma in produzione che sarebbe un rischio di sicurezza. Per il sito di produzione, si vuole aggiungere una regola di autorizzazione che limita l'accesso al log degli errori agli amministratori e 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 versione 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 qui.

<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" causa l'aggiunta di questo location elemento come elemento di pari livello a qualsiasi elemento esistente location nel file Web.config . È già presente un location elemento che specifica le regole di autorizzazione per la pagina Aggiorna crediti .

È 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 suWeb.Release.config e scegliere Anteprima trasformazione.

Menu Trasformazione anteprima

Verrà visualizzata una pagina che mostra il file di sviluppoWeb.config a sinistra e il fileWeb.config distribuito sarà simile a quello a destra, con le modifiche evidenziate.

Anteprima della trasformazione di debug

Screenshot che mostra la Web.config Anteprima con il file di sviluppo a sinistra e quale sarà il file distribuito a destra con le modifiche evidenziate.

( Nell'anteprima è possibile notare alcune modifiche aggiuntive per cui non sono state scritte trasformazioni: queste in genere comportano la rimozione dello spazio vuoto che non influisce sulla funzionalità.

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

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 di sicurezza. L'esempio ELMAH in questa esercitazione non deve essere considerato una configurazione consigliata. Si tratta di 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.

Impostazione gestita nei file di trasformazione del profilo di pubblicazione

Uno scenario comune consiste nell'avere impostazioni fileWeb.config che devono essere diverse in ogni ambiente distribuito. Ad esempio, un'applicazione che chiama un servizio WCF potrebbe richiedere un endpoint diverso negli 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 in quale ambiente 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 dell'ambiente viene omesso quando l'applicazione è in esecuzione in gestione temporanea o in produzione.

Le pagine Web di Contoso University leggeno un valore impostato appSettings nel 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 consiste nel modificare i valori dell'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 è , ed è valueciò che verrà modificato nel file di Web.config distribuito. Il codice illustrato qui causa l'attributo value dell'elemento EnvironmentappSettings da impostare su "Test" nel file Web.config distribuito.

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, staging e produzione. Questa operazione verrà eseguita nella distribuzione in IIS e nella 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 in Servizio app di Azure vedere Specificare le impostazioni Web.config in Azure in precedenza in questo argomento.

Impostazione delle stringhe di connessione

Anche se il file di trasformazione predefinito contiene un esempio che mostra come aggiornare una stringa di connessione, nella maggior parte dei casi non è necessario configurare le trasformazioni delle stringhe di connessione, perché è possibile specificare le stringhe di connessione nel profilo di pubblicazione. Questa operazione verrà eseguita nella distribuzione in IIS e nella distribuzione nelle esercitazioni di produzione .

Riepilogo

A questo punto è stata eseguita la maggior parte delle trasformazioniWeb.configprima di creare i profili di pubblicazione e si è vista un'anteprima di ciò che sarà nel file di Web.config distribuito.

Screenshot che mostra l'anteprima Web.config con il file originale Web.config a sinistra e il file trasformato Web.config sarà simile a quello 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.

Altre informazioni

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