Creare e testare una funzione di Azure semplice in locale con Visual Studio
Gli utenti possono scrivere una funzione di Azure, eseguirne il debug e distribuirla dal portale di Azure. Tuttavia, la scrittura di funzioni direttamente nell'ambiente di produzione, staging o test potrebbe non essere appropriata. Ad esempio, scrivere unit test automatizzati per funzioni di Azure o usare la distribuzione su richiesta di funzioni di Azure in app per le funzioni in Azure. In genere gli sviluppatori preferiscono usare un editor del codice e strumenti di sviluppo piuttosto che l'ambiente fornito dal portale di Azure. Visual Studio consente di sviluppare e gestire il codice di Funzioni di Azure usando altri codici e servizi in un singolo progetto.
Nello scenario relativo agli orologi di lusso online gli sviluppatori hanno già familiarità con Visual Studio 2022. Si decide quindi di usare Visual Studio come ambiente di sviluppo primario per la creazione di funzioni di Azure. Visual Studio offre inoltre un ambiente eccellente per testare le funzioni in locale prima di distribuirle in Azure.
In questa unità si apprende come usare gli strumenti disponibili in Visual Studio per la compilazione e il test di una funzione di Azure nel computer locale.
Importante
Questo articolo supporta le funzioni della libreria di classi .NET eseguite in-process con il runtime. Le funzioni C# possono essere eseguite anche out-of-process e isolate dal runtime di Funzioni. Il modello di processo di lavoro isolato è l'unico modo per eseguire versioni non LTS delle app .NET e .NET Framework nelle versioni correnti del runtime di Funzioni. Per altre informazioni, vedere Funzioni del processo di lavoro isolato .NET.
Modificare l'installazione di Visual Studio
Prima di tutto, è possibile configurare Visual Studio con gli strumenti Web e cloud necessari per l'ambiente di sviluppo.
Con Visual Studio 2022 installato in locale, aprire Programma di installazione di Visual Studio e in Visual Studio Community 2022 selezionare Modifica.
Viene visualizzata la pagina Modifica - Visual Studio.
Nella scheda Carichi di lavoro selezionare le caselle di controllo Sviluppo ASP.NET e Web e Sviluppo di Azure, quindi selezionare Modifica.
Nella finestra di dialogo di verifica selezionare Sì. Viene visualizzata la pagina Programma di installazione di Visual Studio e viene visualizzato lo stato di avanzamento dei pacchetti installati.
Estensione degli strumenti per Funzioni di Azure per Visual Studio
Gli strumenti per Funzioni di Azure sono un'estensione di Visual Studio che consente di creare, testare e distribuire funzioni di Azure nell'ambiente di sviluppo locale. Per creare rapidamente una nuova app per le funzioni di Azure, questa estensione offre un modello da compilare e quindi distribuire una funzione di Azure direttamente in Azure da Visual Studio.
L'estensione Funzioni di Azure e strumenti per processi Web è inclusa in Visual Studio 2022.
App per le funzioni di Azure
Un'app per le funzioni ospita una o più funzioni e fornisce l'ambiente e il runtime per le funzioni.
Una funzione di Azure viene attivata da un evento, anziché essere chiamata direttamente da un'app. Specificare il tipo di evento che attiva ogni funzione nell'app per le funzioni di Azure. Gli eventi disponibili includono:
- Trigger BLOB. Questo tipo di funzione viene eseguita quando un file viene caricato o modificato nell'archivio Blob di Azure.
- Trigger hub eventi. Un trigger di Hub eventi esegue la funzione quando un hub eventi riceve un messaggio.
- Trigger CosmosDB. Questo trigger viene eseguito quando un documento viene aggiunto o modificato in un database Azure Cosmos DB. È possibile usare questo trigger per l'integrazione di Azure Cosmos DB con altri servizi. Ad esempio, se un documento che rappresenta l'ordine di un cliente viene aggiunto a un database, si potrebbe usare un trigger per inviare una copia dell'ordine a una coda per l'elaborazione.
- Trigger HTTP. Un trigger HTTP esegue la funzione quando viene ricevuta una richiesta HTTP in un'app Web. È anche possibile usare il trigger per rispondere ai webhook. Un webhook è un callback che si verifica quando un elemento ospitato da un sito Web viene modificato. Ad esempio, è possibile creare una funzione che viene attivata da un webhook di un repository GitHub quando viene modificato un elemento nel repository.
- Trigger coda. Questo trigger avvia la funzione quando viene aggiunto un nuovo elemento a una coda di archiviazione di Azure.
- Trigger coda ServiceBus. Questo trigger avvia la funzione quando viene aggiunto un nuovo elemento a una coda del bus di servizio di Azure.
- Trigger argomento ServiceBus. Questo trigger esegue la funzione in risposta a un nuovo messaggio in arrivo in un argomento del bus di servizio.
- Trigger timer. Questo evento avvia la funzione a intervalli regolari, in base a una pianificazione definita.
La tabella seguente illustra il livello più alto di .NET Core o .NET Framework che è possibile usare con una versione specifica di Funzioni.
Versione del runtime di Funzioni | In-Process | Processo di lavoro isolato |
---|---|---|
Funzioni 4.x | .NET 6.0 | .NET 6.0 .NET 7.0 .NET 8.0 .NET Framework 4.8 |
Funzioni 1.x | .NET Framework 4.8 | n/d |
Un'app per le funzioni di Azure archivia le informazioni di gestione, il codice e i log in Archiviazione di Azure. Per contenere questi dati, si crea un account di archiviazione. L'account di archiviazione deve supportare BLOB, Coda, File e Archiviazione tabelle di Azure. A questo scopo, usare un account di archiviazione di Azure generico. Per specificare l'account di archiviazione da usare per la funzione, usare la finestra di dialogo mostrata in precedenza.
Una funzione può eseguire operazioni sensibili o con privilegi. Una funzione attivata da una richiesta HTTP può essere esposta pubblicamente. Potrebbe essere necessario limitare la possibilità di eseguire questa funzione a determinati gruppi di utenti. Per proteggere una funzione, specificare i diritti di accesso necessari per attivare la funzione. Una funzione attivata da una richiesta HTTP supporta tre livelli di diritti di accesso:
- Anonimo. Non è necessaria alcuna autenticazione e qualsiasi utente può attivare la funzione.
- Funzione. La richiesta HTTP deve fornire una chiave che consente al runtime della funzione di Azure di autorizzare la richiesta. È possibile creare questa chiave separatamente e gestirla usando il portale di Azure.
- Amministratore. Simile a Funzione. L'utente deve specificare una chiave con la richiesta HTTP che attiva la funzione. La differenza sta nel fatto che la chiave è di tipo Amministratore. Questa chiave può essere usata per accedere a qualsiasi funzione nell'app per le funzioni. Come nel caso della chiave di tipo Funzione, questa chiave viene creata separatamente.
Se si sta creando una funzione attivata da eventi diversi da richieste HTTP, è necessario fornire una stringa di connessione e altri dati per consentire all'app per le funzioni di accedere alla risorsa che attiva l'evento. Se, ad esempio, si sta scrivendo una funzione attivata da un evento di archiviazione BLOB, è necessario specificare la stringa di connessione per l'account di archiviazione BLOB corrispondente.
Struttura di una funzione di Azure
Una funzione di Azure viene implementata come classe statica. La classe fornisce un metodo statico e asincrono denominato Run
, che funge da punto di ingresso per la classe.
I parametri passati al metodo Run
forniscono il contesto per il trigger. Se è un trigger HTTP, la funzione riceve un oggetto HttpRequest. Questo oggetto contiene l'intestazione e il corpo della richiesta. È possibile accedere ai dati nella richiesta usando le stesse tecniche disponibili in qualsiasi app HTTP. Gli attributi applicati a questa funzione specificano i requisiti di autorizzazione (in questo caso Anonimo) e le operazioni HTTP a cui risponde la funzione (GET e POST).
Il codice di esempio seguente, generato da Visual Studio, esamina la stringa di query fornita come parte dell'URL per la richiesta e cerca un parametro denominato name. Il codice usa anche un oggetto StreamReader per deserializzare il corpo della richiesta e tenta di leggere il valore di una proprietà anch'essa denominata name dalla richiesta. Se name viene trovato nella stringa di query o nel corpo della richiesta, nella risposta viene restituito il valore name. In caso contrario, la funzione genera una risposta di errore con il messaggio: Passare un nome nella stringa di query o nel corpo della richiesta.
public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
}
La funzione restituisce un valore contenente i risultati e i dati di output, di cui viene eseguito il wrapping in un oggetto IActionResult. Il valore viene restituito nel corpo della risposta HTTP per la richiesta.
Tipi di trigger diversi ricevono parametri di input e tipi restituiti diversi. L'esempio seguente mostra il codice generato per un trigger BLOB. In questo esempio, i contenuti del BLOB sono vengono restituiti tramite un oggetto Stream e viene fornito anche il nome del BLOB. Il trigger non restituisce dati. Il suo scopo è leggere ed elaborare i dati nel BLOB denominato.
public static class Function2
{
[FunctionName("Function2")]
public static void Run([BlobTrigger("samples-workitems/{name}", Connection = "xxxxxxxxxxxxxxxxxxxxxxx")]Stream myBlob, string name, ILogger log)
{
log.LogInformation($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}
}
In tutti i casi, a una funzione di viene passato un parametro ILogger. La funzione può usare questo parametro per scrivere messaggi di log, che l'app per le funzioni scrive nell'archiviazione per l'analisi successiva.
Una funzione contiene anche i metadati che specificano il tipo di trigger, i requisiti di sicurezza e qualsiasi altra informazione specifica. È possibile modificare i metadati tramite HttpTrigger, BlobTrigger o altri attributi di trigger, come illustrato negli esempi. L'attributo FunctionName che precede unaa funzione è un identificatore della funzione usata dall'app per le funzioni. Non è necessario che questo nome sia identico al nome della funzione, ma è consigliabile mantenere questi nomi sincronizzati per evitare confusione.
Testare un'app per le funzioni di Azure in locale
È possibile usare il debugger di Visual Studio per creare e testare l'app per una funzione di Azure in locale. Per avviare il debugger, premere F5 oppure, nel menu Debug, selezionare Avvia debug. Viene avviata la versione locale del runtime delle funzioni. Le funzioni sono disponibili per i test. L'esempio mostra il runtime che ospita Function1, la funzione attivata da un evento HTTP. L'URL indica l'endpoint a cui la funzione è attualmente collegata.
Se si apre un Web browser e si visita questo URL, si attiva la funzione. L'immagine seguente mostra la risposta generata da una richiesta HTTP GET che non include un corpo. È possibile vedere il messaggio generato dal codice che restituisce l'oggetto BadRequestObjectResult dalla funzione.
Se si fornisce una stringa di query che include un parametro name, la funzione legge ed elabora il valore.
Durante l'esecuzione di codice è possibile visualizzare i messaggi di traccia nella finestra del runtime delle funzioni. È possibile usare le funzionalità di debug standard di Visual Studio se è necessario impostare punti di interruzione ed esaminare il flusso del controllo in una funzione.