Ottimizzare il codice AzureOptimizing Your Azure Code

Quando si programmano app che utilizzano Microsoft Azure, esistono alcune procedure consigliate da seguire per evitare problemi con la scalabilità di app, il comportamento e le prestazioni in un ambiente cloud.When you’re programming apps that use Microsoft Azure, there are some coding practices you should follow to help avoid problems with app scalability, behavior and performance in a cloud environment. Microsoft fornisce uno strumento di analisi del codice di Azure che riconosce molti di questi problemi comunemente riscontrati e aiuta a risolverli.Microsoft provides an Azure Code Analysis tool that recognizes and identifies several of these commonly-encountered issues and helps you resolve them. È possibile scaricare lo strumento in Visual Studio tramite NuGet.You can download the tool in Visual Studio via NuGet.

Regole di analisi codice di AzureAzure Code Analysis rules

Lo strumento di analisi del codice di Azure utilizza le regole seguenti per contrassegnare automaticamente il codice di Azure quando rileva i problemi noti che influiscono sulle prestazioni.The Azure Code Analysis tool uses the following rules to automatically flag your Azure code when it finds known performance-impacting issues. I problemi rilevati vengono visualizzati come avvisi o errori del compilatore.Detected issues appear as a warnings or compiler errors. Correzioni del codice o suggerimenti per risolvere l'avviso o l’errore vengono spesso forniti tramite un'icona a forma di lampadina.Code fixes or suggestions to resolve the warning or error are often provided through a light bulb icon.

Evitare di utilizzare la modalità stato sessione (in-process) predefinitaAvoid using default (in-process) session state mode

IDID

AP0000AP0000

DescrizioneDescription

Se si utilizza la modalità di stato sessione (in-process) predefinita per le applicazioni cloud, è possibile perdere lo stato della sessione.If you use the default (in-process) session state mode for cloud applications, you can lose session state.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

Per impostazione predefinita, la modalità stato sessione specificata nel file Web. config è in corso.By default, the session state mode specified in the web.config file is in-process. Inoltre, se nessuna voce è specificata nel file di configurazione, la modalità di stato della sessione è predefinita per in-process.Also, if no entry specified in the configuration file, the Session State mode defaults to in-process. La modalità in-process memorizza lo stato della sessione sul server web.The in-process mode stores session state in memory on the web server. Quando un'istanza viene riavviata o una nuova istanza viene utilizzata per il bilanciamento del carico o il supporto di failover, non viene salvato lo stato della sessione archiviato in memoria sul server web.When an instance is restarted or a new instance is used for load balancing or failover support, the session state stored in memory on the web server isn’t saved. Questa situazione impedisce che l'applicazione sia scalabile nel cloud.This situation prevents the application from being scalable on the cloud.

Lo stato della sessione ASP.NET supporta diverse opzioni di archiviazione per i dati dello stato sessione: InProc, StateServer, SQLServer, personalizzato e Off.ASP.NET session state supports several different storage options for session state data: InProc, StateServer, SQLServer, Custom, and Off. È consigliabile utilizzare la modalità personalizzata per ospitare i dati in un archivio esterno dello stato della sessione, ad esempio Provider di stato della sessione di Azure per Redis.It’s recommended that you use Custom mode to host data on an external Session State store, such as Azure Session State provider for Redis.

SoluzioneSolution

Una soluzione consigliata consiste nell'archiviare lo stato della sessione in un servizio cache gestito.One recommended solution is to store session state on a managed cache service. Informazioni su come utilizzare il provider di stato della sessione di Azure per Redis per archiviare lo stato della sessione.Learn how to use Azure Session State provider for Redis to store your session state. È anche possibile archiviare lo stato della sessione in altre posizioni per garantire che l'applicazione sia scalabile nel cloud.You can also store session state in other places to ensure your application is scalable on the cloud. Per ulteriori informazioni sulle soluzioni alternative, leggere Modalità dello stato di sessione.To learn more about alternative solutions please read Session State Modes.

L’esecuzione del metodo non deve essere asincronaRun method should not be async

IDID

AP1000AP1000

DescrizioneDescription

Creare metodi asincroni, ad esempio await, fuori dal metodo Run () e quindi chiamare i metodi asincroni da Run ().Create asynchronous methods (such as await) outside of the Run() method and then call the async methods from Run(). La dichiarazione del metodo [Run ()](https://msdn.microsoft.com/library/azure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx) come asincrona fa sì che il ruolo di lavoro immetta un ciclo di riavvio.Declaring the [Run()](https://msdn.microsoft.com/library/azure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx) method as async causes the worker role to enter a restart loop.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

La chiamata di metodi asincroni all'interno del metodo Run() fa sì che il runtime del servizio cloud ricicli il ruolo di lavoro.Calling async methods inside the Run() method causes the cloud service runtime to recycle the worker role. Quando viene avviato un ruolo di lavoro, l'esecuzione del programma ha luogo all'interno del metodo Run().When a worker role starts, all program execution takes place inside the Run() method. Chiudere il metodo Run() fa sì che il ruolo di lavoro venga riavviato.Exiting the Run() method causes the worker role to restart. Quando il runtime di ruolo di lavoro raggiunge il metodo asincrono, invia tutte le operazioni dopo il metodo asincrono e poi ritorna When the worker role runtime hits the async method, it dispatches all operations after the async method and then returns. In questo modo, il ruolo di lavoro esce dal metodo [[[Run()](https://msdn.microsoft.com/library/azure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx)](https://msdn.microsoft.com/library/azure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx)](https://msdn.microsoft.com/library/azure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx) e si riavvia.This causes the worker role to exit from the [[[Run()](https://msdn.microsoft.com/library/azure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx)](https://msdn.microsoft.com/library/azure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx)](https://msdn.microsoft.com/library/azure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx) method and restart. Nell'iterazione successiva dell'esecuzione, il ruolo di lavoro raggiunge nuovamente il metodo asincrono e viene riavviato, causando nuovamente il riciclo anche del ruolo di lavoro.In the next iteration of execution, the worker role hits the async method again and restarts, causing the worker role to recycle again as well.

SoluzioneSolution

Posizionare tutte le operazioni asincrone fuori dal metodo Run .Place all async operations outside of the Run() method. Quindi, chiamare il metodo asincrono refactoring dall'interno del metodo [Run ()](https://msdn.microsoft.com/library/azure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx) , ad esempio RunAsync().wait.Then, call the refactored async method from inside the [Run()](https://msdn.microsoft.com/library/azure/microsoft.windowsazure.serviceruntime.roleentrypoint.run.aspx) method, such as RunAsync().wait. Lo strumento di analisi del codice di Azure può aiutare a risolvere il problema.The Azure Code Analysis tool can help you fix this issue.

Il seguente frammento di codice dimostra la correzione del codice per questo problema:The following code snippet demonstrates the code fix for this issue:

public override void Run()
{
    RunAsync().Wait();
}

public async Task RunAsync()
{
    //Asynchronous operations code logic
    // This is a sample worker implementation. Replace with your logic.

    Trace.TraceInformation("WorkerRole1 entry point called");

    HttpClient client = new HttpClient();

    Task<string> urlString = client.GetStringAsync("http://msdn.microsoft.com");

    while (true)
    {
        Thread.Sleep(10000);
        Trace.TraceInformation("Working");

        string stream = await urlString;
    }

}

Autenticazione della firma di accesso condiviso con il bus di servizioUse Service Bus Shared Access Signature authentication

IDID

AP2000AP2000

DescrizioneDescription

Uso della firma di accesso condiviso per l’autenticazione.Use Shared Access Signature (SAS) for authentication. Il servizio di controllo di accesso (ACS) è deprecato per l'autenticazione di bus di servizio.Access Control Service (ACS) is being deprecated for service bus authentication.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

Per una sicurezza ottimale, Azure Active Directory consiste nella sostituzione dell’autenticazione ACS con l'autenticazione SAS.For enhanced security, Azure Active Directory is replacing ACS authentication with SAS authentication. Vedere Azure Active Directory è il futuro di ACS per informazioni sul piano di transizione.See Azure Active Directory is the future of ACS for information on the transition plan.

SoluzioneSolution

Utilizzare l'autenticazione SAS nelle app.Use SAS authentication in your apps. Nell'esempio seguente viene illustrato come utilizzare un token SAS esistente per accedere a uno spazio dei nomi o a un’entità del bus di servizio.The following example shows how to use an existing SAS token to access a service bus namespace or entity.

MessagingFactory listenMF = MessagingFactory.Create(endpoints, new StaticSASTokenProvider(subscriptionToken));
SubscriptionClient sc = listenMF.CreateSubscriptionClient(topicPath, subscriptionName);
BrokeredMessage receivedMessage = sc.Receive();

Per altre informazioni, vedere gli argomenti seguenti.See the following topics for more information.

È consigliabile utilizzare il metodo OnMessage per evitare il "ciclo di ricezione"Consider using OnMessage method to avoid "receive loop"

IDID

AP2002AP2002

DescrizioneDescription

Per evitare di entrare in un "ciclo di ricezione" la chiamata al metodo OnMessage è una soluzione ottimale, poi chiamare il metodo Receive.To avoid going into a "receive loop," calling the OnMessage method is a better solution for receiving messages than calling the Receive method. Tuttavia, se è necessario utilizzare il metodo Ricezione e si specifica un tempo di attesa del server non predefinito, assicurarsi che il tempo di attesa del server sia più di un minuto.However, if you must use the Receive method, and you specify a non-default server wait time, make sure the server wait time is more than one minute.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

Quando si chiama OnMessage, il client avvia un message pump interno che esegue costantemente il polling della coda o della sottoscrizione.When calling OnMessage, the client starts an internal message pump that constantly polls the queue or subscription. Questo pump del messaggio contiene un ciclo infinito che emette una chiamata per ricevere messaggi.This message pump contains an infinite loop that issues a call to receive messages. Se la chiamata scade, genera una nuova chiamata.If the call times out, it issues a new call. L'intervallo di timeout è determinato dal valore della proprietà OperationTimeout del MessagingFactory che viene usato.The timeout interval is determined by the value of the OperationTimeout property of the MessagingFactorythat’s being used.

Il vantaggio dell'uso di OnMessage rispetto a Receive è che gli utenti non devono eseguire manualmente il polling dei messaggi, gestire le eccezioni, elaborare più messaggi in parallelo e completare i messaggi.The advantage of using OnMessage compared to Receive is that users don’t have to manually poll for messages, handle exceptions, process multiple messages in parallel, and complete the messages.

Se si chiama la Ricezione senza utilizzare il valore predefinito, assicurarsi che il valore ServerWaitTime sia superiore a un minuto.If you call Receive without using its default value, be sure the ServerWaitTime value is more than one minute. L'impostazione di ServerWaitTime a più di un minuto impedisce al server di scadere prima che il messaggio venga ricevuto completamente.Setting ServerWaitTime to more than one minute prevents the server from timing out before the message is fully received.

SoluzioneSolution

Vedere gli esempi di codice seguenti per gli utilizzi consigliati.Please see the following code examples for recommended usages. Per altre informazioni, vedere metodo QueueClient.OnMessage (Microsoft.ServiceBus.Messaging) e metodo QueueClient.Receive (Microsoft.ServiceBus.Messaging).For more details, see QueueClient.OnMessage Method (Microsoft.ServiceBus.Messaging)and QueueClient.Receive Method (Microsoft.ServiceBus.Messaging).

Per migliorare le prestazioni dell'infrastruttura di messaggistica di Azure, vedere il modello di progettazione Nozioni di base di messaggistica asincrona.To improve the performance of the Azure messaging infrastructure, see the design pattern Asynchronous Messaging Primer.

Il seguente è un esempio dell'utilizzo di OnMessage per ricevere i messaggi.The following is an example of using OnMessage to receive messages.

void ReceiveMessages()
{
    // Initialize message pump options.
    OnMessageOptions options = new OnMessageOptions();
    options.AutoComplete = true; // Indicates if the message-pump should call complete on messages after the callback has completed processing.
    options.MaxConcurrentCalls = 1; // Indicates the maximum number of concurrent calls to the callback the pump should initiate.
    options.ExceptionReceived += LogErrors; // Enables you to get notified of any errors encountered by the message pump.

    // Start receiving messages.
    QueueClient client = QueueClient.Create("myQueue");
    client.OnMessage((receivedMessage) => // Initiates the message pump and callback is invoked for each message that is recieved, calling close on the client will stop the pump.
    {
        // Process the message.
    }, options);
    Console.WriteLine("Press any key to exit.");
    Console.ReadKey();

Il seguente è un esempio dell'utilizzo di Ricezione con il tempo di attesa predefinito del server.The following is an example of using Receive with the default server wait time.

string connectionString =  
CloudConfigurationManager.GetSetting("Microsoft.ServiceBus.ConnectionString");

QueueClient Client =  
    QueueClient.CreateFromConnectionString(connectionString, "TestQueue");

while (true)  
{   
   BrokeredMessage message = Client.Receive();
   if (message != null)
   {
      try  
      {
         Console.WriteLine("Body: " + message.GetBody<string>());
         Console.WriteLine("MessageID: " + message.MessageId);
         Console.WriteLine("Test Property: " +  
            message.Properties["TestProperty"]);

         // Remove message from queue
         message.Complete();
      }

      catch (Exception)
      {
         // Indicate a problem, unlock message in queue
         message.Abandon();
      }
   }

Il seguente è un esempio dell'utilizzo di Ricezione con il tempo di attesa non predefinito del server.The following is an example of using Receive with a non-default server wait time.

while (true)  
{   
   BrokeredMessage message = Client.Receive(new TimeSpan(0,1,0));

   if (message != null)
   {
      try  
      {
         Console.WriteLine("Body: " + message.GetBody<string>());
         Console.WriteLine("MessageID: " + message.MessageId);
         Console.WriteLine("Test Property: " +  
            message.Properties["TestProperty"]);

         // Remove message from queue
         message.Complete();
      }

      catch (Exception)
      {
         // Indicate a problem, unlock message in queue
         message.Abandon();
      }
   }
}

Si consideri l'utilizzo di metodi asincroni del Bus di servizioConsider using asynchronous Service Bus methods

IDID

AP2003AP2003

DescrizioneDescription

Utilizzare i metodi asincroni del Bus di servizio per migliorare le prestazioni con la messaggistica negoziata.Use asynchronous Service Bus methods to improve performance with brokered messaging.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

L’utilizzo di metodi asincroni consente la concorrenza del programma di applicazione perché l'esecuzione di ogni chiamata non blocca il thread principale.Using asynchronous methods enables application program concurrency because executing each call doesn’t block the main thread. Quando si utilizzano i metodi di messaggistica del Bus di servizio, l’esecuzione di un'operazione (inviare, ricevere, eliminare, ecc) richiede tempo.When using Service Bus messaging methods, performing an operation (send, receive, delete, etc.) takes time. Questa volta include l'elaborazione dell'operazione dal servizio Bus di servizio oltre alla latenza della richiesta e risposta.This time includes the processing of the operation by the Service Bus service in addition to the latency of the request and the reply. Per aumentare il numero di operazioni per volta, è necessario eseguire le operazioni contemporaneamente.To increase the number of operations per time, operations must execute concurrently. Per altre informazioni, consultare le Procedure consigliate per il miglioramento delle prestazioni tramite la messaggistica negoziata del bus di servizio.For more information please refer to Best Practices for Performance Improvements Using Service Bus Brokered Messaging.

SoluzioneSolution

Vedere QueueClient class (Microsoft.ServiceBus.Messaging) per ricevere informazioni su come utilizzare il metodo asincrono consigliato.See QueueClient Class (Microsoft.ServiceBus.Messaging) for information about how to use the recommended asynchronous method.

Per migliorare le prestazioni dell'infrastruttura di messaggistica di Azure, vedere il modello di progettazione Nozioni di base di messaggistica asincrona.To improve the performance of the Azure messaging infrastructure, see the design pattern Asynchronous Messaging Primer.

Prendere in considerazione il partizionamento delle code e degli argomenti del bus di servizio.Consider partitioning Service Bus queues and topics

IDID

AP2004AP2004

DescrizioneDescription

Esegue il partizionamento delle code e degli argomenti del bus di servizio per ottenere prestazioni migliori con la messaggistica del bus di servizio.Partition Service Bus queues and topics for better performance with Service Bus messaging.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

Il partizionamento delle code e degli argomenti del bus di servizio permette di aumentare la disponibilità dei servizi e la velocità effettiva delle prestazioni, perché la velocità effettiva complessiva di una coda o di un argomento partizionato non è più limitata dalle prestazioni di un singolo broker messaggi o archivio di messaggistica.Partitioning Service Bus queues and topics increases performance throughput and service availability because the overall throughput of a partitioned queue or topic is no longer limited by the performance of a single message broker or messaging store. Una interruzione temporanea di un archivio di messaggistica non influisce sulla disponibilità di code e argomenti partizionati.In addition, a temporary outage of a messaging store doesn’t make a partitioned queue or topic unavailable. Per ulteriori informazioni, vedere Partizionamento delle entità di messaggistica.For more information, see Partitioning Messaging Entities.

SoluzioneSolution

Il seguente frammento di codice mostra come suddividere le entità di messaggistica.The following code snippet shows how to partition messaging entities.

// Create partitioned topic.
NamespaceManager ns = NamespaceManager.CreateFromConnectionString(myConnectionString);
TopicDescription td = new TopicDescription(TopicName);
td.EnablePartitioning = true;
ns.CreateTopic(td);

Per altre informazioni, vedere il blog di Microsoft Azure Partitioned Service Bus Queues and Topics (Code e argomenti partizionati del bus di servizio) e l'esempio Microsoft Azure Service Bus Partitioned Queue (Coda partizionata del bus di servizio di Microsoft Azure).For more information, see Partitioned Service Bus Queues and Topics | Microsoft Azure Blog and check out the Microsoft Azure Service Bus Partitioned Queue sample.

Non impostare SharedAccessStartTimeDo not set SharedAccessStartTime

IDID

AP3001AP3001

DescrizioneDescription

È consigliabile evitare l'utilizzo di SharedAccessStartTimeset all'ora corrente per avviare immediatamente il criterio di accesso condiviso.You should avoid using SharedAccessStartTimeset to the current time to immediately start the Shared Access policy. È sufficiente impostare questa proprietà se si desidera avviare i criteri di accesso condivisi in un secondo momento.You only need to set this property if you want to start the Shared Access policy at a later time.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

La sincronizzazione dell'orologio comporta una differenza oraria lieve tra i Data Center.Clock synchronization causes a slight time difference among datacenters. Ad esempio, si pensa logicamente che impostando l'ora di inizio di un archivio criteri SAS come l'ora corrente utilizzando Now o un metodo simile si farà sì che i criteri SAS abbiano effetto immediato.For example, you would logically think setting the start time of a storage SAS policy as the current time by using DateTime.Now or a similar method will cause the SAS policy to take effect immediately. Tuttavia, le differenze lievi di tempo tra i Data Center possono provocare problemi con questo poiché alcuni tempi del datacenter potrebbero essere leggermente oltre l'ora di inizio, mentre altri la precedono.However, the slight time differences between datacenters can cause problems with this since some datacenter times might be slightly later than the start time, while others ahead of it. Di conseguenza, i criteri di firma di accesso condiviso possono scadere rapidamente (o persino immediatamente) se la durata di criteri è troppo breve.As a result, the SAS policy can expire quickly (or even immediately) if the policy lifetime is set too short.

Per ulteriori informazioni sull'utilizzo di firma di accesso condiviso sull'archiviazione di Azure, vedere Introduzione della tabella SAS (Shared Access Signature) della coda SAS coda del BLOB SAS - Blog del Team Microsoft Azure Storage - Home page - sito blog di MSDN.For more guidance on using Shared Access Signature on Azure storage, see Introducing Table SAS (Shared Access Signature), Queue SAS and update to Blob SAS - Microsoft Azure Storage Team Blog - Site Home - MSDN Blogs.

SoluzioneSolution

Rimuovere l'istruzione che imposta l'ora di inizio del criterio di accesso condiviso.Remove the statement that sets the start time of the shared access policy. Lo strumento di analisi del codice di Azure fornisce una correzione per questo problema.The Azure Code Analysis tool provides a fix for this issue. Per ulteriori informazioni sulla gestione della protezione, vedere il modello di progettazione Modello passepartout.For more information on security management, please see the design pattern Valet Key Pattern.

Il seguente frammento di codice dimostra la correzione del codice per questo problema.The following code snippet demonstrates the code fix for this issue.

// The shared access policy provides  
// read/write access to the container for 10 hours.
blobPermissions.SharedAccessPolicies.Add("mypolicy", new SharedAccessBlobPolicy()
{
   // To ensure SAS is valid immediately, don’t set start time.
   // This way, you can avoid failures caused by small clock differences.
   SharedAccessExpiryTime = DateTime.UtcNow.AddHours(10),
   Permissions = SharedAccessBlobPermissions.Write |
      SharedAccessBlobPermissions.Read
});

L’ora di scadenza del criterio di accesso condiviso deve essere più di cinque minuti Shared Access Policy expiry time must be more than five minutes

IDID

AP3002AP3002

DescrizioneDescription

Può esistere una differenza di circa cinque minuti negli orologi tra i Data Center in posizioni diverse a causa di una condizione nota come "sfasamento."There can be as much as a five minute difference in clocks among datacenters at different locations due to a condition known as "clock skew." Per evitare che il token del criterio SAS scada prima del previsto, impostare l'ora di scadenza a più di cinque minuti.To prevent the SAS policy token from expiring earlier than planned, set the expiry time to be more than five minutes.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

I dataenter in diverse località del mondo sono sincronizzati da un segnale di orologio.Datacenters at different locations around the world synchronize by a clock signal. Poiché occorre tempo affinché il segnale dell’orologio viaggi in località diverse, può esistere una varianza di tempo tra i datacenter in località geografiche diverse anche se apparentemente tutto ciò viene sincronizzato.Because it takes time for clock signal to travel to different locations, there can be a time variance between datacenters at different geographical locations although everything is supposedly synchronized. Questa differenza di tempo può influenzare l’inizio del tempo dell'accesso condiviso e dell’intervallo di scadenza dei criteri.This time difference can affect the Shared Access policy start time and expiration interval. Per verificare che il criterio di accesso condiviso diventi effettivo immediatamente, pertanto, non specificare l'ora di inizio.Therefore, to ensure Shared Access policy takes effect immediately, don’t specify the start time. Inoltre, assicurarsi che l'ora di scadenza sia maggiore di 5 minuti per evitare una scadenza anticipata.In addition, make sure the expiration time is more than 5 minutes to prevent early timeout.

Per ulteriori informazioni sull'utilizzo di firma di accesso condiviso sull'archiviazione di Azure, vedere Introduzione della tabella SAS (Shared Access Signature) della coda SAS coda del BLOB SAS - Blog del Team Microsoft Azure Storage - Home page - sito blog di MSDN.For more information about using Shared Access Signature on Azure storage, see Introducing Table SAS (Shared Access Signature), Queue SAS and update to Blob SAS - Microsoft Azure Storage Team Blog - Site Home - MSDN Blogs.

SoluzioneSolution

Per ulteriori informazioni sulla gestione della protezione, vedere il modello di progettazione Modello passepartout.For more information on security management, see the design pattern Valet Key Pattern.

Di seguito è riportato un esempio di ora di inizio dei criteri di accesso condiviso non specificata.The following is an example of not specifying a Shared Access policy start time.

// The shared access policy provides  
// read/write access to the container for 10 hours.
blobPermissions.SharedAccessPolicies.Add("mypolicy", new SharedAccessBlobPolicy()
{
   // To ensure SAS is valid immediately, don’t set start time.
   // This way, you can avoid failures caused by small clock differences.
   SharedAccessExpiryTime = DateTime.UtcNow.AddHours(10),
   Permissions = SharedAccessBlobPermissions.Write |
      SharedAccessBlobPermissions.Read
});

Di seguito è riportato un esempio di un'ora di inizio dei criteri di accesso condiviso specificata, con un periodo di scadenza dei criteri maggiore di cinque minuti.The following is an example of specifying a Shared Access policy start time with a policy expiration duration greater than five minutes.

// The shared access policy provides  
// read/write access to the container for 10 hours.
blobPermissions.SharedAccessPolicies.Add("mypolicy", new SharedAccessBlobPolicy()
{
   // To ensure SAS is valid immediately, don’t set start time.
   // This way, you can avoid failures caused by small clock differences.
  SharedAccessStartTime = new DateTime(2014,1,20),   
 SharedAccessExpiryTime = new DateTime(2014, 1, 21),
   Permissions = SharedAccessBlobPermissions.Write |
      SharedAccessBlobPermissions.Read
});

Per ulteriori informazioni, Creare e usare una firma di accesso condiviso.For more information, see Create and Use a Shared Access Signature.

Utilizzare CloudConfigurationManagerUse CloudConfigurationManager

IDID

AP4000AP4000

DescrizioneDescription

Usando la classe ConfigurationManager per progetti, come il sito Web di Azure e i servizi mobili di Azure, non si verificano problemi di runtime.Using the ConfigurationManager class for projects such as Azure Website and Azure mobile services won't introduce runtime issues. Come procedura consigliata, tuttavia, è consigliabile usare Cloud ConfigurationManager come modo unificato di gestione delle configurazioni per tutte le applicazioni Cloud di Azure.As a best practice, however, it's a good idea to use CloudConfigurationManager as a unified way of managing configurations for all Azure Cloud applications.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

CloudConfigurationManager legge il file di configurazione appropriato per l'ambiente dell'applicazione.CloudConfigurationManager reads the configuration file appropriate to the application environment.

CloudConfigurationManagerCloudConfigurationManager

SoluzioneSolution

Effettuare il refactoring del codice per utilizzare il CloudConfigurationManager classe.Refactor your code to use the CloudConfigurationManager Class. Una correzione del codice per questo problema viene fornita dallo strumento di analisi del codice di Azure.A code fix for this issue is provided by the Azure Code Analysis tool.

Il seguente frammento di codice dimostra la correzione del codice per questo problema.The following code snippet demonstrates the code fix for this issue. ReplaceReplace

var settings = ConfigurationManager.AppSettings["mySettings"];

conwith

var settings = CloudConfigurationManager.GetSetting("mySettings");

Di seguito è riportato un esempio di come archiviare l'impostazione di configurazione in un file app. config o Web. config.Here's an example of how to store the configuration setting in a App.config or Web.config file. Aggiungere le impostazioni per la sezione appSettings del file di configurazione.Add the settings to the appSettings section of the configuration file. Di seguito è il file Web. config per l'esempio di codice precedente.The following is the Web.config file for the previous code example.

<appSettings>
    <add key="webpages:Version" value="3.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
    <add key="mySettings" value="[put_your_setting_here]"/>
  </appSettings>  

Evitare di utilizzare stringhe di connessione hardcodedAvoid using hard-coded connection strings

IDID

AP4001AP4001

DescrizioneDescription

Se si utilizzano stringhe di connessione hardcoded ed è necessario aggiornarle in un secondo momento, sarà necessario apportare modifiche al codice sorgente e ricompilare l'applicazione.If you use hard-coded connection strings and you need to update them later, you’ll have to make changes to your source code and recompile the application. Tuttavia, se si archiviano le stringhe di connessione in un file di configurazione, è possibile cambiarle successivamente semplicemente aggiornando il file di configurazione.However, if you store your connection strings in a configuration file, you can change them later by simply updating the configuration file.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

Impostare come hardcoded le stringhe di connessione è sconsigliato perché presenta problemi quando è necessario modificare rapidamente le stringhe di connessione.Hard-coding connection strings is a bad practice because it introduces problems when connection strings need to be changed quickly. Inoltre, se il progetto deve essere controllato nel codice sorgente, le stringhe di connessione hardcoded presentano una vulnerabilità di protezione poiché le stringhe possono essere visualizzate nel codice sorgente.In addition, if the project needs to be checked in to source control, hard-coded connection strings introduce security vulnerabilities since the strings can be viewed in the source code.

SoluzioneSolution

Archiviare le stringhe di connessione nel file di configurazione o negli ambienti di Azure.Store connection strings in the configuration files or Azure environments.

  • Per le applicazioni autonome utilizzare la config. dell’app per archiviare le impostazioni della stringa di connessione.For standalone applications, use app.config to store connection string settings.
  • Per le applicazioni web ospitate in IIS, utilizzare config. web per archiviare le stringhe di connessione.For IIS-hosted web applications, use web.config to store connection strings.
  • Per le applicazioni ASP.NET vNext utilizzare configuration.json per archiviare le stringhe di connessione.For ASP.NET vNext applications, use configuration.json to store connection strings.

Per informazioni sull'uso di file di configurazione, ad esempio web.config o app. config, vedere Linee guida configurazione di ASP.NET Web.For information on using configurations files such as web.config or app.config, see ASP.NET Web Configuration Guidelines. Per informazioni su come funzionano le variabili di ambiente di Azure, vedere Azure Web Sites: How Application Strings and Connection Strings Work (Siti Web di Microsoft Azure sul funzionamento delle stringhe di applicazione e di connessione).For information on how Azure environment variables work, see Azure Web Sites: How Application Strings and Connection Strings Work. Per informazioni sull'archiviazione della stringa di connessione nel codice sorgente, vedere evitare di inserire informazioni riservate come le stringhe di connessione nei file archiviati nel repository del codice sorgente.For information on storing connection string in source control, see avoid putting sensitive information such as connection strings in files that are stored in source code repository.

Utilizzo del file di configurazione di Diagnostica.Use diagnostics configuration file

IDID

AP5000AP5000

DescrizioneDescription

Anziché configurare le impostazioni di diagnostica nel codice, ad esempio tramite l'API di programmazione della diagnostica di Microsoft.WindowsAzure, è necessario configurare le impostazioni di diagnostica nel file diagnostics wadcfg.Instead of configuring diagnostics settings in your code such as by using the Microsoft.WindowsAzure.Diagnostics programming API, you should configure diagnostics settings in the diagnostics.wadcfg file. (O, diagnostics.wadcfgx se si utilizza Azure SDK 2.5).(Or, diagnostics.wadcfgx if you use Azure SDK 2.5). In questo modo è possibile modificare le impostazioni di diagnostica senza dover ricompilare il codice.By doing this, you can change diagnostics settings without having to recompile your code.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

Prima di Azure SDK 2.5 (che utilizza diagnostica Microsoft Azure 1.3), la diagnostica di Azure (WAD) può essere configurata utilizzando diversi metodi: aggiunta del BLOB di configurazione nel servizio di archiviazione, utilizzando il codice imperativo, la configurazione dichiarativa o la configurazione predefinita.Before Azure SDK 2.5 (which uses Azure diagnostics 1.3), Azure Diagnostics (WAD) could be configured by using several different methods: adding it to the configuration blob in storage, by using imperative code, declarative configuration, or the default configuration. Tuttavia, il modo migliore per configurare la diagnostica consiste nell'utilizzare un file di configurazione XML (wadcfg o diagnositcs.wadcfgx per SDK 2.5 e versioni successive) nel progetto di applicazione.However, the preferred way to configure diagnostics is to use an XML configuration file (diagnostics.wadcfg or diagnositcs.wadcfgx for SDK 2.5 and later) in the application project. In questo approccio, il file diagnostics wadcfg definisce completamente la configurazione e può essere aggiornato e ridistribuito a suo piacimento.In this approach, the diagnostics.wadcfg file completely defines the configuration and can be updated and redeployed at will. Combinare l'uso del file di configurazione wadcfg con i metodi a livello di codice di impostazione delle configurazioni tramite le classi Diagnosticmonitorconfiguration o RoleInstanceDiagnosticManager può generare confusione.Mixing the use of the diagnostics.wadcfg configuration file with the programmatic methods of setting configurations by using the DiagnosticMonitoror RoleInstanceDiagnosticManagerclasses can lead to confusion. Vedere Avviare o modificare la configurazione della diagnostica di Azure per ulteriori informazioni.See Initialize or Change Azure Diagnostics Configuration for more information.

A partire da 1.3 WAD (incluso in Azure SDK 2.5), non è più possibile utilizzare il codice per configurare la diagnostica.Beginning with WAD 1.3 (included with Azure SDK 2.5), it’s no longer possible to use code to configure diagnostics. Di conseguenza, è possibile specificare solo la configurazione quando si applica o si aggiorna l'estensione di diagnostica.As a result, you can only provide the configuration when applying or updating the diagnostics extension.

SoluzioneSolution

Utilizzare la finestra di progettazione di configurazione di diagnostica per spostare le impostazioni di diagnostica per il file di configurazione di diagnostica (diagnositcs.wadcfg o diagnositcs.wadcfgx per SDK 2.5 e versioni successive).Use the diagnostics configuration designer to move diagnostic settings to the diagnostics configuration file (diagnositcs.wadcfg or diagnositcs.wadcfgx for SDK 2.5 and later). È inoltre consigliabile installare Azure SDK 2.5 e utilizzare la funzionalità di diagnostica più recente.It’s also recommended that you install Azure SDK 2.5 and use the latest diagnostics feature.

  1. Dal menu di scelta rapida per il ruolo desiderato scegliere Proprietà, quindi selezionare la scheda Configurazione.On the shortcut menu for the role that you want to configure, choose Properties, and then choose the Configuration tab.
  2. Nella sezione Diagnostica verificare che la casella di controllo Abilita diagnostica sia selezionata.In the Diagnostics section, make sure that the Enable Diagnostics check box is selected.
  3. Scegliere il pulsante Configura .Choose the Configure button.

    Accesso all'opzione Abilita diagnostica

    Vedere Configurazione della diagnostica per i servizi cloud e le macchine virtuali di Azure .per ulteriori informazioni.See Configuring Diagnostics for Azure Cloud Services and Virtual Machines for more information.

Evitare di dichiarare gli oggetti DbContext come staticAvoid declaring DbContext objects as static

IDID

AP6000AP6000

DescrizioneDescription

Per conservare memoria, evitare di dichiarare gli oggetti DbContext come staticTo save memory, avoid declaring DBContext objects as static.

Condividere le idee e i suggerimenti nei Commenti e suggerimenti dell'analisi del codice di Azure.Please share your ideas and feedback at Azure Code Analysis feedback.

MotivoReason

Gli oggetti DBContext contengono i risultati della query da ogni chiamata.DBContext objects hold the query results from each call. Gli oggetti DBContext statici non vengono eliminati fino a quando non viene scaricato il dominio dell'applicazione.Static DBContext objects are not disposed until the application domain is unloaded. Pertanto, un oggetto DBContext statico può utilizzare grandi quantità di memoria.Therefore, a static DBContext object can consume large amounts of memory.

SoluzioneSolution

Dichiarare DBContext come una variabile locale o un campo di istanza non statico, utilizzarlo per un'attività e poi eliminarlo dopo l'uso.Declare DBContext as a local variable or non-static instance field, use it for a task, and then let it be disposed of after use.

Il seguente esempio di classe controller MVC illustra come utilizzare l'oggetto DBContext.The following example MVC controller class shows how to use the DBContext object.

public class BlogsController : Controller
    {
        //BloggingContext is a subclass to DbContext        
        private BloggingContext db = new BloggingContext();
        // GET: Blogs
        public ActionResult Index()
        {
            //business logics…
            return View();
        }
        protected override void Dispose(bool disposing)
        {
            if (disposing)
            {
                db.Dispose();
            }
            base.Dispose(disposing);
        }
    }

Passaggi successiviNext steps

Per altre informazioni sull'ottimizzazione e la risoluzione dei problemi delle app Azure, vedere Risoluzione dei problemi di un'app Web nel servizio app di Azure tramite Visual Studio.To learn more about optimizing and troubleshooting Azure apps, see Troubleshoot a web app in Azure App Service using Visual Studio.