Uso di librerie di classi .NET con Funzioni di Azure

Oltre ai file di script, Funzioni di Azure supporta la pubblicazione di una libreria di classi per l'implementazione di una o più funzioni. È consigliabile usare Visual Studio 2017 Tools per Funzioni di Azure.

Prerequisiti

I prerequisiti di questo articolo sono i seguenti:

Progetto di libreria di classi per Funzioni

Creare un progetto per Funzioni di Azure in Visual Studio. Il modello del nuovo progetto crea i file host.json e local.settings.json. È possibile personalizzare le impostazioni di runtime di Funzioni di Azure nel file host.json.

Nel file local.settings.json vengono archiviate le impostazioni dell'app, le stringhe di connessione e le impostazioni per Strumenti di base di Funzioni di Azure. Per altre informazioni sulla struttura, vedere Scrivere codice per le funzioni di Azure e testarle in locale.

Attributo FunctionName

L'attributo FunctionNameAttribute contrassegna un metodo come punto di ingresso della funzione. Deve essere usato con un solo trigger e con 0 o più associazioni di input e di output.

Conversione in function.json

Quando viene compilato un progetto di Funzioni di Azure, viene generato un file function.json nella directory, che corrisponde al nome della funzione definito da [FunctionName]. Specifica i trigger, le associazioni e i punti che si riferiscono al file di assembly del progetto.

Questa conversione viene eseguita dal pacchetto NuGet Microsoft.NET.Sdk.Functions. L'origine è disponibile nel repository di GitHub azure-functions-vs-build-sdk.

Trigger e associazioni

Nella tabella seguente sono elencati i trigger e le associazioni disponibili in un progetto di libreria di classi di Funzioni di Azure. Tutti gli attributi sono contenuti nello spazio dei nomi Microsoft.Azure.WebJobs.

Associazione Attributo Pacchetto NuGet
Trigger, input e output per archiviazione BLOB BlobAttribute, StorageAccountAttribute Microsoft.Azure.WebJobs
Associazione di input e di output per Cosmos DB DocumentDBAttribute Microsoft.Azure.WebJobs.Extensions.DocumentDB
Trigger e output per Hub eventi EventHubTriggerAttribute, EventHubAttribute Microsoft.Azure.WebJobs.ServiceBus
Input e output per file esterni ApiHubFileAttribute Microsoft.Azure.WebJobs.Extensions.ApiHub
Trigger per HTTP e webhook HttpTriggerAttribute Microsoft.Azure.WebJobs.Extensions.Http
Input e output per App per dispositivi mobili MobileTableAttribute Microsoft.Azure.WebJobs.Extensions.MobileApps
Output per Hub di notifica NotificationHubAttribute Microsoft.Azure.WebJobs.Extensions.NotificationHubs
Trigger e output per l'archiviazione code QueueAttribute, StorageAccountAttribute Microsoft.Azure.WebJobs
Output SendGrid SendGridAttribute Microsoft.Azure.WebJobs.Extensions.SendGrid
Trigger e output per il bus di servizio ServiceBusAttribute, ServiceBusAccountAttribute Microsoft.Azure.WebJobs.ServiceBus
Input e output per l'archiviazione tabelle TableAttribute, StorageAccountAttribute Microsoft.Azure.WebJobs
Trigger timer TimerTriggerAttribute Microsoft.Azure.WebJobs.Extensions
Output di Twilio TwilioSmsAttribute Microsoft.Azure.WebJobs.Extensions.Twilio

Associazioni di trigger, input e output per l'archiviazione BLOB

Funzioni di Azure supporta i trigger e le associazioni di input e di output per l'archiviazione BLOB di Azure. Per altre informazioni sulle espressioni di associazione e sui metadati, vedere Binding dell'archiviazione BLOB di Funzioni di Azure.

Con l'attributo [BlobTrigger] viene definito un trigger del BLOB. È possibile usare l'attributo [StorageAccount] per definire l'account di archiviazione usato da un'intera funzione o classe.

[StorageAccount("AzureWebJobsStorage")]
[FunctionName("BlobTriggerCSharp")]        
public static void Run([BlobTrigger("samples-workitems/{name}")] Stream myBlob, string name, TraceWriter log)
{
    log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
}

Gli input e output del BLOB vengono definiti con l'attributo [Blob] e con un parametroFileAccess che indica la lettura o la scrittura. L'esempio seguente usa un trigger e un'associazione di output del BLOB.

[FunctionName("ResizeImage")]
[StorageAccount("AzureWebJobsStorage")]
public static void Run(
    [BlobTrigger("sample-images/{name}")] Stream image, 
    [Blob("sample-images-sm/{name}", FileAccess.Write)] Stream imageSmall, 
    [Blob("sample-images-md/{name}", FileAccess.Write)] Stream imageMedium)
{
    var imageBuilder = ImageResizer.ImageBuilder.Current;
    var size = imageDimensionsTable[ImageSize.Small];

    imageBuilder.Build(image, imageSmall,
        new ResizeSettings(size.Item1, size.Item2, FitMode.Max, null), false);

    image.Position = 0;
    size = imageDimensionsTable[ImageSize.Medium];

    imageBuilder.Build(image, imageMedium,
        new ResizeSettings(size.Item1, size.Item2, FitMode.Max, null), false);
}

public enum ImageSize { ExtraSmall, Small, Medium }

private static Dictionary<ImageSize, (int, int)> imageDimensionsTable = new Dictionary<ImageSize, (int, int)>() {
    { ImageSize.ExtraSmall, (320, 200) },
    { ImageSize.Small,      (640, 400) },
    { ImageSize.Medium,     (800, 600) }
};

Associazioni di input e di output per Cosmos DB

Funzioni di Azure supporta le associazioni di input e output per Cosmos DB. Per altre informazioni sulle funzionalità dell'associazione per Cosmos DB, vedere Associazioni di Funzioni di Azure per Cosmos DB.

Per definire l'associazione a un documento Cosmos DB, usare l'attributo [DocumentDB] nel pacchetto NuGet Microsoft.Azure.WebJobs.Extensions.DocumentDB. L'esempio seguente contiene un trigger della coda e un'associazione di output dell'API di DocumentDB:

[FunctionName("QueueToDocDB")]        
public static void Run(
    [QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] string myQueueItem, 
    [DocumentDB("ToDoList", "Items", ConnectionStringSetting = "DocDBConnection")] out dynamic document)
{
    document = new { Text = myQueueItem, id = Guid.NewGuid() };
}

Trigger e output per Hub eventi

Funzioni di Azure supporta il trigger e le associazioni di output per Hub eventi. Per altre informazioni, vedere Associazioni di Hub eventi di Funzioni di Azure.

I tipi [Microsoft.Azure.WebJobs.ServiceBus.EventHubTriggerAttribute] e [Microsoft.Azure.WebJobs.ServiceBus.EventHubAttribute] sono definiti nel pacchetto NuGet Microsoft.Azure.WebJobs.ServiceBus.

Nell'esempio seguente viene usato un trigger per Hub eventi:

[FunctionName("EventHubTriggerCSharp")]
public static void Run([EventHubTrigger("samples-workitems", Connection = "EventHubConnection")] string myEventHubMessage, TraceWriter log)
{
    log.Info($"C# Event Hub trigger function processed a message: {myEventHubMessage}");
}

L'esempio seguente contiene un output per Hub eventi che usa il valore restituito dal metodo come output:

[FunctionName("EventHubOutput")]
[return: EventHub("outputEventHubMessage", Connection = "EventHubConnection")]
public static string Run([TimerTrigger("0 */5 * * * *")] TimerInfo myTimer, TraceWriter log)
{
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
    return $"{DateTime.Now}";
}

Input e output per file esterni

Funzioni di Azure supporta il trigger e le associazioni di input e di output per file esterni, ad esempio Google Drive, Dropbox e OneDrive. Per altre informazioni, vedere Associazioni di file esterni in Funzioni di Azure. Gli attributi [ExternalFileTrigger] e [ExternalFile] sono definiti nel pacchetto NuGet Microsoft.Azure.WebJobs.Extensions.ApiHub.

Nell'esempio C# seguente viene illustrata l'associazione di input e di output di un file esterno. Il codice copia il file di input nel file di output.

[StorageAccount("MyStorageConnection")]
[FunctionName("ExternalFile")]
[return: ApiHubFile("MyFileConnection", "samples-workitems/{queueTrigger}-Copy", FileAccess.Write)]
public static string Run([QueueTrigger("myqueue-items")] string myQueueItem, 
    [ApiHubFile("MyFileConnection", "samples-workitems/{queueTrigger}", FileAccess.Read)] string myInputFile, 
    TraceWriter log)
{
    log.Info($"C# Queue trigger function processed: {myQueueItem}");
    return myInputFile;
}

HTTP e webhook

Usare l'attributo HttpTrigger per definire un trigger HTTP o un webhook. Questo attributo è definito nel pacchetto NuGet Microsoft.Azure.WebJobs.Extensions.Http. È possibile personalizzare livello di autorizzazione, tipo di webhook, route e metodi. L'esempio seguente definisce un trigger HTTP con autenticazione anonima e tipo di webhook genericJson.

[FunctionName("HttpTriggerCSharp")]
public static HttpResponseMessage Run([HttpTrigger(AuthorizationLevel.Anonymous, WebHookType = "genericJson")] HttpRequestMessage req)
{
    return req.CreateResponse(HttpStatusCode.OK);
}

Input e output per App per dispositivi mobili

Funzioni di Azure supporta le associazioni di input e output per App per dispositivi mobili. Per altre informazioni, vedere Associazioni di app per dispositivi mobili in Funzioni di Azure. L'attributo [MobileTable] è definito nel pacchetto NuGet Microsoft.Azure.WebJobs.Extensions.MobileApps.

L'esempio seguente illustra un'associazione di output per App per dispositivi mobili:

[FunctionName("MobileAppsOutput")]        
[return: MobileTable(ApiKeySetting = "MyMobileAppKey", TableName = "MyTable", MobileAppUriSetting = "MyMobileAppUri")]
public static object Run([QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] string myQueueItem, TraceWriter log)
{
    return new { Text = $"I'm running in a C# function! {myQueueItem}" };
}

Output per Hub di notifica

Funzioni di Azure supporta un'associazione di output per Hub di notifica. Per altre informazioni, vedere Associazione di output di Hub di notifica in Funzioni di Azure. L'attributo [NotificationHub] è definito nel pacchetto NuGet Microsoft.Azure.WebJobs.Extensions.NotificationHubs.

Trigger e output per l'archiviazione code

Funzioni di Azure supporta il trigger e le associazioni di output per le code di Azure. Per altre informazioni, vedere Associazioni di archiviazione code in Funzioni di Azure.

Nell'esempio seguente viene illustrato come usare il tipo restituito dalla funzione con un'associazione di output per la coda, tramite l'attributo [Queue]. Per definire un trigger della coda, usare l'attributo [QueueTrigger].

[StorageAccount("AzureWebJobsStorage")]
public static class QueueFunctions
{
    // HTTP trigger with queue output binding
    [FunctionName("QueueOutput")]
    [return: Queue("myqueue-items")]
    public static string QueueOutput([HttpTrigger] dynamic input,  TraceWriter log)
    {
        log.Info($"C# function processed: {input.Text}");
        return input.Text;
    }

    // Queue trigger
    [FunctionName("QueueTrigger")]
    [StorageAccount("AzureWebJobsStorage")]
    public static void QueueTrigger([QueueTrigger("myqueue-items")] string myQueueItem, TraceWriter log)
    {
        log.Info($"C# function processed: {myQueueItem}");
    }
}

Output di SendGrid

Funzioni di Azure supporta un'associazione di output di SendGrid per inviare tramite posta elettronica a livello di programmazione. Per altre informazioni, vedere Associazioni di SendGrid di Funzioni di Azure.

L'attributo [SendGrid] è definito nel pacchetto NuGet Microsoft.Azure.WebJobs.Extensions.SendGrid.

Di seguito è riportato un esempio di utilizzo di un trigger della coda per il bus di servizio e di un binding di output di SendGrid mediante SendGridMessage:

[FunctionName("SendEmail")]
public static void Run(
    [ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "ServiceBusConnection")] OutgoingEmail email,
    [SendGrid] out SendGridMessage message)
{
    message = new SendGridMessage();
    message.AddTo(email.To);
    message.AddContent("text/html", email.Body);
    message.SetFrom(new EmailAddress(email.From));
    message.SetSubject(email.Subject);
}

public class OutgoingEmail
{
    public string To { get; set; }
    public string From { get; set; }
    public string Subject { get; set; }
    public string Body { get; set; }
}

Trigger e output per il bus di servizio

Funzioni di Azure supporta il trigger e le associazioni di output per le code e gli argomenti del bus di servizio. Per altre informazioni sulla configurazione delle associazioni, vedere Associazioni del bus di servizio di Funzioni di Azure.

Gli attributi [ServiceBusTrigger] e [ServiceBus] sono definiti nel pacchetto NuGet Microsoft.Azure.WebJobs.ServiceBus.

Di seguito è riportato un esempio di trigger della coda per il bus di servizio:

[FunctionName("ServiceBusQueueTriggerCSharp")]                    
public static void Run([ServiceBusTrigger("myqueue", AccessRights.Manage, Connection = "ServiceBusConnection")] string myQueueItem, TraceWriter log)
{
    log.Info($"C# ServiceBus queue trigger function processed message: {myQueueItem}");
}

Di seguito è riportato un esempio di un'associazione di output per il bus di servizio che usa il tipo restituito dal metodo come output:

[FunctionName("ServiceBusOutput")]
[return: ServiceBus("myqueue", Connection = "ServiceBusConnection")]
public static string ServiceBusOutput([HttpTrigger] dynamic input, TraceWriter log)
{
    log.Info($"C# function processed: {input.Text}");
    return input.Text;
}

Input e output per l'archiviazione tabelle

Funzioni di Azure supporta le associazioni di input e output per l'archiviazione tabelle di Azure. Per altre informazioni, vedere Associazioni di archiviazione tabelle in Funzioni di Azure.

L'esempio seguente si riferisce a una classe con due funzioni e illustra l'associazione di input e di output per l'archiviazione tabelle.

[StorageAccount("AzureWebJobsStorage")]
public class TableStorage
{
    public class MyPoco
    {
        public string PartitionKey { get; set; }
        public string RowKey { get; set; }
        public string Text { get; set; }
    }

    [FunctionName("TableOutput")]
    [return: Table("MyTable")]
    public static MyPoco TableOutput([HttpTrigger] dynamic input, TraceWriter log)
    {
        log.Info($"C# http trigger function processed: {input.Text}");
        return new MyPoco { PartitionKey = "Http", RowKey = Guid.NewGuid().ToString(), Text = input.Text };
    }

    // use the metadata parameter "queueTrigger" to bind the queue payload
    [FunctionName("TableInput")]
    public static void TableInput([QueueTrigger("table-items")] string input, [Table("MyTable", "Http", "{queueTrigger}")] MyPoco poco, TraceWriter log)
    {
        log.Info($"C# function processed: {poco.Text}");
    }
}

Trigger timer

Funzioni di Azure è dotata di un binding trigger timer che consente di eseguire il codice della funzione secondo una pianificazione definita. Per altre informazioni sulle funzionalità dell'associazione, vedere Pianificare l'esecuzione di codice con Funzioni di Azure.

Nel piano a consumo è possibile definire le pianificazioni usando un'espressione CRON. Se si usa un piano di servizio app, è anche possibile usare una stringa TimeSpan.

L'esempio seguente definisce un trigger del timer eseguito ogni 5 minuti:

[FunctionName("TimerTriggerCSharp")]
public static void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, TraceWriter log)
{
    log.Info($"C# Timer trigger function executed at: {DateTime.Now}");
}

Output di Twilio

Funzioni di Azure supporta le associazioni di output di Twilio per consentire alle funzioni di inviare SMS. Per altre informazioni, vedere Inviare messaggi SMS da Funzioni di Azure usando l'associazione di output Twilio.

L'attributo [TwilioSms] è definito nel pacchetto Microsoft.Azure.WebJobs.Extensions.Twilio.

L'esempio C# seguente usa un trigger della coda e un'associazione di output Twilio:

[FunctionName("QueueTwilio")]
[return: TwilioSms(AccountSidSetting = "TwilioAccountSid", AuthTokenSetting = "TwilioAuthToken", From = "+1425XXXXXXX" )]
public static SMSMessage Run([QueueTrigger("myqueue-items", Connection = "AzureWebJobsStorage")] JObject order, TraceWriter log)
{
    log.Info($"C# Queue trigger function processed: {order}");

    var message = new SMSMessage()
    {
        Body = $"Hello {order["name"]}, thanks for your order!",
        To = order["mobileNumber"].ToString()
    };

    return message;
}

Passaggi successivi

Per altre informazioni sull'uso di Funzioni di Azure in script C#, vedere Guida di riferimento per gli sviluppatori C# di Funzioni di Azure.

Per informazioni su altre associazioni e altri trigger per Funzioni di Azure, vedere Guida di riferimento per gli sviluppatori di trigger e associazioni di Funzioni di Azure.