Referencia para desarrolladores de scripts de C# de Azure Functions (.csx)Azure Functions C# script (.csx) developer reference

Este artículo es una introducción al desarrollo de Azure Functions mediante el uso de scripts de C# ( .csx).This article is an introduction to developing Azure Functions by using C# script (.csx).

Azure Functions es compatible con C# y con los lenguajes de programación de scripts de C#.Azure Functions supports C# and C# script programming languages. Si busca orientación sobre cómo usar C# en un proyecto de biblioteca de clases de Visual Studio, consulte la referencia para desarrolladores de C#.If you're looking for guidance on using C# in a Visual Studio class library project, see C# developer reference.

En este artículo se supone que ya ha leído la guía para desarrolladores de Azure Functions.This article assumes that you've already read the Azure Functions developers guide.

Funcionamiento de .csxHow .csx works

La experiencia de scripts de C# para Azure Functions se basa en el SDK de Azure WebJobs.The C# script experience for Azure Functions is based on the Azure WebJobs SDK. Los datos fluyen en la función de C# a través de los argumentos de método.Data flows into your C# function via method arguments. Los nombres de los argumentos se especifican en un archivo function.json, y hay nombres predefinidos para acceder a cosas como el registrador de funciones y los tokens de cancelación.Argument names are specified in a function.json file, and there are predefined names for accessing things like the function logger and cancellation tokens.

El formato .csx permite escribir menos "texto reutilizable" y centrarse en escribir solo una función de C#.The .csx format allows you to write less "boilerplate" and focus on writing just a C# function. En lugar de encapsular todo en un espacio de nombres y una clase, defina solamente un método Run.Instead of wrapping everything in a namespace and class, just define a Run method. Incluya las referencias a ensamblados y los espacios de nombres al principio del archivo como de costumbre.Include any assembly references and namespaces at the beginning of the file as usual.

Los archivos .csx de una aplicación de función se compilan cuando se inicializa una instancia.A function app's .csx files are compiled when an instance is initialized. Este paso de compilación puede conllevar, por ejemplo, que un arranque en frío pueda tardar más para las funciones de script de C# en comparación con las bibliotecas de clases de C#.This compilation step means things like cold start may take longer for C# script functions compared to C# class libraries. En este paso de compilación también se plantea la pregunta de por qué las funciones de script de C# se pueden editar en Azure Portal y las bibliotecas de clases de C# no.This compilation step is also why C# script functions are editable in the Azure portal, while C# class libraries are not.

Estructura de carpetasFolder structure

La estructura de carpetas para un proyecto de script de C# tiene el siguiente aspecto:The folder structure for a C# script project looks like the following:

FunctionsProject
 | - MyFirstFunction
 | | - run.csx
 | | - function.json
 | | - function.proj
 | - MySecondFunction
 | | - run.csx
 | | - function.json
 | | - function.proj
 | - host.json
 | - extensions.csproj
 | - bin

Hay un archivo host.json compartido que se puede usar para configurar la aplicación de función.There's a shared host.json file that can be used to configure the function app. Cada función tiene su propio archivo de código (.csx) y archivo de configuración de enlace (function.json).Each function has its own code file (.csx) and binding configuration file (function.json).

Las extensiones de enlace necesarias en la versión 2.x del tiempo de ejecución de Functions se definen en el archivo extensions.csproj, con los archivos de biblioteca de la carpeta bin.The binding extensions required in version 2.x of the Functions runtime are defined in the extensions.csproj file, with the actual library files in the bin folder. Al desarrollar de forma local, debe registrar las extensiones de enlace.When developing locally, you must register binding extensions. Al desarrollar funciones en Azure Portal, este registro se realiza automáticamente.When developing functions in the Azure portal, this registration is done for you.

Enlace a argumentosBinding to arguments

Los datos de entrada o salida está enlazados a un parámetro de función de script de C# mediante la propiedad name en el archivo de configuración function.json.Input or output data is bound to a C# script function parameter via the name property in the function.json configuration file. En el ejemplo siguiente se muestra un archivo function.json y un archivo run.csx para una función queue-triggered.The following example shows a function.json file and run.csx file for a queue-triggered function. El parámetro que recibe los datos del mensaje de cola se llama myQueueItem porque ese es el valor de la propiedad name.The parameter that receives data from the queue message is named myQueueItem because that's the value of the name property.

{
    "disabled": false,
    "bindings": [
        {
            "type": "queueTrigger",
            "direction": "in",
            "name": "myQueueItem",
            "queueName": "myqueue-items",
            "connection":"MyStorageConnectionAppSetting"
        }
    ]
}
#r "Microsoft.WindowsAzure.Storage"

using Microsoft.Extensions.Logging;
using Microsoft.WindowsAzure.Storage.Queue;
using System;

public static void Run(CloudQueueMessage myQueueItem, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed: {myQueueItem.AsString}");
}

La instrucción #r se explica más adelante en este artículo.The #r statement is explained later in this article.

Tipos compatibles para los enlacesSupported types for bindings

Cada enlace tiene sus propios tipos compatibles; por ejemplo, se puede utilizar un desencadenador de blobs con un parámetro de cadena, un parámetro POCO, un parámetro CloudBlockBlob o cualquiera de los demás tipos compatibles.Each binding has its own supported types; for instance, a blob trigger can be used with a string parameter, a POCO parameter, a CloudBlockBlob parameter, or any of several other supported types. En el artículo de referencia sobre los enlaces de blobs se enumeran todos los tipos de parámetros compatibles para los desencadenadores de blobs.The binding reference article for blob bindings lists all supported parameter types for blob triggers. Para obtener más información, vea el artículo sobre desencadenadores y enlaces y los documentos de referencia sobre enlaces para cada tipo de enlace.For more information, see Triggers and bindings and the binding reference docs for each binding type.

Sugerencia

Si planea usar los enlaces HTTP o WebHook, debe evitar el agotamiento de puertos que puede deberse a la creación incorrecta de instancias de HttpClient.If you plan to use the HTTP or WebHook bindings, plan to avoid port exhaustion that can be caused by improper instantiation of HttpClient. Para más información, consulte How to manage connections in Azure Functions (Administración de conexiones en Azure Functions).For more information, see How to manage connections in Azure Functions.

Referencia a clases personalizadasReferencing custom classes

Si tiene que utilizar una clase objeto CRL estándar (POCO) personalizada, puede incluir la definición de clase en el mismo archivo o colocarla en un archivo independiente.If you need to use a custom Plain Old CLR Object (POCO) class, you can include the class definition inside the same file or put it in a separate file.

En el ejemplo siguiente se muestra un ejemplo de run.csx que incluye una definición de clase POCO.The following example shows a run.csx example that includes a POCO class definition.

public static void Run(string myBlob, out MyClass myQueueItem)
{
    log.Verbose($"C# Blob trigger function processed: {myBlob}");
    myQueueItem = new MyClass() { Id = "myid" };
}

public class MyClass
{
    public string Id { get; set; }
}

Una clase POCO debe tener un captador y un establecedor definidos para cada propiedad.A POCO class must have a getter and setter defined for each property.

Reutilización del código .csxReusing .csx code

Puede usar las clases y los métodos definidos en otros archivos .csx con el archivo run.csx.You can use classes and methods defined in other .csx files in your run.csx file. Para ello, utilice directivas #load en el archivo run.csx.To do that, use #load directives in your run.csx file. En el siguiente ejemplo, una rutina de registro denominada MyLogger se comparte en myLogger.csx y se carga en run.csx mediante la directiva #load:In the following example, a logging routine named MyLogger is shared in myLogger.csx and loaded into run.csx using the #load directive:

Archivo run.csxde ejemplo:Example run.csx:

#load "mylogger.csx"

using Microsoft.Extensions.Logging;

public static void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"Log by run.csx: {DateTime.Now}");
    MyLogger(log, $"Log by MyLogger: {DateTime.Now}");
}

Archivo mylogger.csxde ejemplo:Example mylogger.csx:

public static void MyLogger(ILogger log, string logtext)
{
    log.LogInformation(logtext);
}

El uso de un archivo .csx compartido es un patrón común para asignar rigurosamente los datos transferidos entre funciones mediante un objeto POCO.Using a shared .csx file is a common pattern when you want to strongly type the data passed between functions by using a POCO object. En el siguiente ejemplo simplificado, un desencadenador HTTP y un desencadenador de cola comparten un objeto POCO denominado Order para tipar fuertemente los datos del pedido:In the following simplified example, an HTTP trigger and queue trigger share a POCO object named Order to strongly type the order data:

Por ejemplo, run.csx para el desencadenador HTTP:Example run.csx for HTTP trigger:

#load "..\shared\order.csx"

using System.Net;
using Microsoft.Extensions.Logging;

public static async Task<HttpResponseMessage> Run(Order req, IAsyncCollector<Order> outputQueueItem, ILogger log)
{
    log.LogInformation("C# HTTP trigger function received an order.");
    log.LogInformation(req.ToString());
    log.LogInformation("Submitting to processing queue.");

    if (req.orderId == null)
    {
        return new HttpResponseMessage(HttpStatusCode.BadRequest);
    }
    else
    {
        await outputQueueItem.AddAsync(req);
        return new HttpResponseMessage(HttpStatusCode.OK);
    }
}

Por ejemplo, run.csx para el desencadenador de cola:Example run.csx for queue trigger:

#load "..\shared\order.csx"

using System;
using Microsoft.Extensions.Logging;

public static void Run(Order myQueueItem, out Order outputQueueItem, ILogger log)
{
    log.LogInformation($"C# Queue trigger function processed order...");
    log.LogInformation(myQueueItem.ToString());

    outputQueueItem = myQueueItem;
}

Por ejemplo, order.csx:Example order.csx:

public class Order
{
    public string orderId {get; set; }
    public string custName {get; set;}
    public string custAddress {get; set;}
    public string custEmail {get; set;}
    public string cartId {get; set; }

    public override String ToString()
    {
        return "\n{\n\torderId : " + orderId +
                  "\n\tcustName : " + custName +
                  "\n\tcustAddress : " + custAddress +
                  "\n\tcustEmail : " + custEmail +
                  "\n\tcartId : " + cartId + "\n}";
    }
}

Puede usar una ruta de acceso relativa con la directiva #load :You can use a relative path with the #load directive:

  • #load "mylogger.csx" carga un archivo que se encuentra en la carpeta de la función.#load "mylogger.csx" loads a file located in the function folder.
  • #load "loadedfiles\mylogger.csx" carga un archivo ubicado en una carpeta dentro de la carpeta de la función.#load "loadedfiles\mylogger.csx" loads a file located in a folder in the function folder.
  • #load "..\shared\mylogger.csx" carga un archivo ubicado en una carpeta del mismo nivel que la carpeta de la función, es decir, directamente en wwwroot.#load "..\shared\mylogger.csx" loads a file located in a folder at the same level as the function folder, that is, directly under wwwroot.

La directiva #load solo funciona con archivos .csx, no con archivos .cs.The #load directive works only with .csx files, not with .cs files.

Enlace al valor devuelto del métodoBinding to method return value

Puede usar el valor devuelto de un método para un enlace de salida, mediante el nombre $return en function.json.You can use a method return value for an output binding, by using the name $return in function.json. Para ver ejemplos, consulte Desencadenadores y enlaces.For examples, see Triggers and bindings.

Utilice el valor devuelto solo si una ejecución de función correcta siempre da como resultado un valor devuelto para pasar al enlace de salida.Use the return value only if a successful function execution always results in a return value to pass to the output binding. En caso contrario, use ICollector o IAsyncCollector, como se muestra en la sección siguiente.Otherwise, use ICollector or IAsyncCollector, as shown in the following section.

Escribir varios valores de salidaWriting multiple output values

Para escribir varios valores en un enlace de salida, o si una invocación de función correcta podría no dar nada como resultado para pasar al enlace de salida, use los tipos ICollector o IAsyncCollector.To write multiple values to an output binding, or if a successful function invocation might not result in anything to pass to the output binding, use the ICollector or IAsyncCollector types. Estos tipos son colecciones de solo escritura que se escriben en el enlace de salida cuando se completa el método.These types are write-only collections that are written to the output binding when the method completes.

En este ejemplo se escriben varios mensajes en cola en la misma cola mediante ICollector:This example writes multiple queue messages into the same queue using ICollector:

public static void Run(ICollector<string> myQueue, ILogger log)
{
    myQueue.Add("Hello");
    myQueue.Add("World!");
}

RegistroLogging

Para grabar la salida en los registros de streaming de C#, incluya un argumento de tipo ILogger.To log output to your streaming logs in C#, include an argument of type ILogger. Es recomendable que lo denomine log.We recommend that you name it log. Evite el uso de Console.Write en Azure Functions.Avoid using Console.Write in Azure Functions.

public static void Run(string myBlob, ILogger log)
{
    log.LogInformation($"C# Blob trigger function processed: {myBlob}");
}

Nota

Para obtener información sobre un marco de trabajo de registro más reciente que puede usar en lugar de TraceWriter, consulte Escribir registros en funciones de C# en el artículo Supervisión de Azure Functions.For information about a newer logging framework that you can use instead of TraceWriter, see Write logs in C# functions in the Monitor Azure Functions article.

AsyncAsync

Para convertir una función en asincrónica, use la palabra clave async y devuelva un objeto Task.To make a function asynchronous, use the async keyword and return a Task object.

public async static Task ProcessQueueMessageAsync(
        string blobName,
        Stream blobInput,
        Stream blobOutput)
{
    await blobInput.CopyToAsync(blobOutput, 4096);
}

No puede usar parámetros out en funciones asincrónicas.You can't use out parameters in async functions. Para los enlaces de salida, utilice el valor devuelto de función o un objeto recopilador en su lugar.For output bindings, use the function return value or a collector object instead.

Tokens de cancelaciónCancellation tokens

Una función puede aceptar un parámetro CancellationToken que permite que el sistema operativo notifique al código cuando la función esté a punto de finalizar.A function can accept a CancellationToken parameter, which enables the operating system to notify your code when the function is about to be terminated. Puede utilizar esta notificación para asegurarse de que la función no se termina inesperadamente en una forma que deje los datos en un estado incoherente.You can use this notification to make sure the function doesn't terminate unexpectedly in a way that leaves data in an inconsistent state.

En el ejemplo siguiente se muestra cómo comprobar la finalización inminente de la función.The following example shows how to check for impending function termination.

using System;
using System.IO;
using System.Threading;

public static void Run(
    string inputText,
    TextWriter logger,
    CancellationToken token)
{
    for (int i = 0; i < 100; i++)
    {
        if (token.IsCancellationRequested)
        {
            logger.WriteLine("Function was cancelled at iteration {0}", i);
            break;
        }
        Thread.Sleep(5000);
        logger.WriteLine("Normal processing for queue message={0}", inputText);
    }
}

Importación de espacios de nombresImporting namespaces

Si necesita importar espacios de nombres, puede hacerlo de la manera habitual, con la cláusula using .If you need to import namespaces, you can do so as usual, with the using clause.

using System.Net;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)

Los siguientes espacios de nombres se importan automáticamente y, por tanto, son opcionales:The following namespaces are automatically imported and are therefore optional:

  • System
  • System.Collections.Generic
  • System.IO
  • System.Linq
  • System.Net.Http
  • System.Threading.Tasks
  • Microsoft.Azure.WebJobs
  • Microsoft.Azure.WebJobs.Host

Referencia a ensamblados externosReferencing external assemblies

Para los ensamblados de marco, agregue referencias mediante la directiva #r "AssemblyName" .For framework assemblies, add references by using the #r "AssemblyName" directive.

#r "System.Web.Http"

using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;

public static Task<HttpResponseMessage> Run(HttpRequestMessage req, ILogger log)

El entorno de hospedaje de Azure Functions agrega automáticamente los siguientes ensamblados:The following assemblies are automatically added by the Azure Functions hosting environment:

  • mscorlib
  • System
  • System.Core
  • System.Xml
  • System.Net.Http
  • Microsoft.Azure.WebJobs
  • Microsoft.Azure.WebJobs.Host
  • Microsoft.Azure.WebJobs.Extensions
  • System.Web.Http
  • System.Net.Http.Formatting

Se puede hacer referencia a los ensamblados siguientes con nombre simple (por ejemplo, #r "AssemblyName"):The following assemblies may be referenced by simple-name (for example, #r "AssemblyName"):

  • Newtonsoft.Json
  • Microsoft.WindowsAzure.Storage
  • Microsoft.ServiceBus
  • Microsoft.AspNet.WebHooks.Receivers
  • Microsoft.AspNet.WebHooks.Common
  • Microsoft.Azure.NotificationHubs

Hacer referencia a ensamblados personalizadosReferencing custom assemblies

Para hacer referencia a un ensamblado personalizado, puede usar un ensamblado compartido o un ensamblado privado:To reference a custom assembly, you can use either a shared assembly or a private assembly:

  • Los ensamblados compartidos se comparten en todas las funciones dentro de una aplicación de función.Shared assemblies are shared across all functions within a function app. Para hacer referencia a un ensamblado personalizado, cargue el ensamblado en una carpeta denominada bin en su carpeta raíz de aplicaciones de función (wwwroot).To reference a custom assembly, upload the assembly to a folder named bin in your function app root folder (wwwroot).

  • Los ensamblados privados forman parte del contexto de una función determinada y admiten la instalación de prueba de versiones diferentes.Private assemblies are part of a given function's context, and support side-loading of different versions. Los ensamblados privados se deben cargar en una carpeta bin en el directorio de la función.Private assemblies should be uploaded in a bin folder in the function directory. Haga referencia a ellos con el nombre de archivo, como #r "MyAssembly.dll".Reference the assemblies using the file name, such as #r "MyAssembly.dll".

Para más información sobre cómo cargar archivos en su carpeta de función, consulte la sección sobre administración de paquetes.For information on how to upload files to your function folder, see the section on package management.

Directorios inspeccionadosWatched directories

El directorio que contiene el archivo de script de función se inspecciona automáticamente para buscar cambios en los ensamblados.The directory that contains the function script file is automatically watched for changes to assemblies. Para inspeccionar los cambios de los ensamblado en otros directorios, agréguelos a la lista watchDirectories en host.json.To watch for assembly changes in other directories, add them to the watchDirectories list in host.json.

Uso de paquetes NuGetUsing NuGet packages

Para usar paquetes NuGet en una función de C# de la versión 2.x, cargue un archivo function.proj en la carpeta de la función del sistema de archivos de la aplicación de funciones.To use NuGet packages in a 2.x C# function, upload a function.proj file to the function's folder in the function app's file system. Este es un ejemplo del archivo function.proj en el que se agrega una referencia a la versión 1.1.0 de Microsoft.ProjectOxford.Face:Here is an example function.proj file that adds a reference to Microsoft.ProjectOxford.Face version 1.1.0:

<Project Sdk="Microsoft.NET.Sdk">
    <PropertyGroup>
        <TargetFramework>netstandard2.0</TargetFramework>
    </PropertyGroup>

    <ItemGroup>
        <PackageReference Include="Microsoft.ProjectOxford.Face" Version="1.1.0" />
    </ItemGroup>
</Project>

Para usar una fuente NuGet personalizada, especifique la fuente en un archivo Nuget.Config en la raíz de la aplicación la función.To use a custom NuGet feed, specify the feed in a Nuget.Config file in the Function App root. Para más información, vea Configuring NuGet behavior (Configuración del comportamiento de NuGet).For more information, see Configuring NuGet behavior.

Nota

En las funciones de C# de la versión 1.x, se hace referencia a los paquetes NuGet con un archivo project.json en lugar de un archivo function.proj.In 1.x C# functions, NuGet packages are referenced with a project.json file instead of a function.proj file.

Para las funciones de la versión 1.x, use un archivo project.json en su lugar.For 1.x functions, use a project.json file instead. Aquí tiene un ejemplo de un archivo project.json:Here is an example project.json file:

{
  "frameworks": {
    "net46":{
      "dependencies": {
        "Microsoft.ProjectOxford.Face": "1.1.0"
      }
    }
   }
}

Uso de un archivo function.projUsing a function.proj file

  1. Abra la función en Azure Portal.Open the function in the Azure portal. La pestaña de registros muestra el resultado de la instalación del paquete.The logs tab displays the package installation output.
  2. Para cargar un archivo function.proj, use uno de los métodos descritos en Actualización de los archivos de aplicación de funciones en el tema de referencia para desarrolladores de Azure Functions.To upload a function.proj file, use one of the methods described in the How to update function app files in the Azure Functions developer reference topic.
  3. Una vez que haya cargado el archivo function.proj, verá un resultado similar al del ejemplo siguiente en el registro de streaming de la función:After the function.proj file is uploaded, you see output like the following example in your function's streaming log:
2018-12-14T22:00:48.658 [Information] Restoring packages.
2018-12-14T22:00:48.681 [Information] Starting packages restore
2018-12-14T22:00:57.064 [Information] Restoring packages for D:\local\Temp\9e814101-fe35-42aa-ada5-f8435253eb83\function.proj...
2016-04-04T19:02:50.511 Restoring packages for D:\home\site\wwwroot\HttpTriggerCSharp1\function.proj...
2018-12-14T22:01:00.844 [Information] Installing Newtonsoft.Json 10.0.2.
2018-12-14T22:01:01.041 [Information] Installing Microsoft.ProjectOxford.Common.DotNetStandard 1.0.0.
2018-12-14T22:01:01.140 [Information] Installing Microsoft.ProjectOxford.Face.DotNetStandard 1.0.0.
2018-12-14T22:01:09.799 [Information] Restore completed in 5.79 sec for D:\local\Temp\9e814101-fe35-42aa-ada5-f8435253eb83\function.proj.
2018-12-14T22:01:10.905 [Information] Packages restored.

Variables de entornoEnvironment variables

Para obtener una variable de entorno o un valor de configuración de aplicación, use System.Environment.GetEnvironmentVariable, como se muestra en el ejemplo de código siguiente:To get an environment variable or an app setting value, use System.Environment.GetEnvironmentVariable, as shown in the following code example:

public static void Run(TimerInfo myTimer, ILogger log)
{
    log.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}");
    log.LogInformation(GetEnvironmentVariable("AzureWebJobsStorage"));
    log.LogInformation(GetEnvironmentVariable("WEBSITE_SITE_NAME"));
}

public static string GetEnvironmentVariable(string name)
{
    return name + ": " +
        System.Environment.GetEnvironmentVariable(name, EnvironmentVariableTarget.Process);
}

Enlace en tiempo de ejecuciónBinding at runtime

En C# y otros lenguajes .NET, puede usar un patrón de enlace imperativo, en contraposición a los enlaces declarativos de function.json.In C# and other .NET languages, you can use an imperative binding pattern, as opposed to the declarative bindings in function.json. Los enlaces imperativos resultan útiles cuando los parámetros de enlace tienen que calcularse en tiempo de ejecución, en lugar de en el tiempo de diseño.Imperative binding is useful when binding parameters need to be computed at runtime rather than design time. Con este patrón, se pueden establecer enlaces compatibles de entrada y salida sobre la marcha en el código de función.With this pattern, you can bind to supported input and output bindings on-the-fly in your function code.

Defina un enlace imperativo como se indica a continuación:Define an imperative binding as follows:

  • No incluya una entrada en function.json para los enlaces imperativos deseados.Do not include an entry in function.json for your desired imperative bindings.
  • Pase un parámetro de entrada Binder binder o IBinder binder.Pass in an input parameter Binder binder or IBinder binder.
  • Utilice el siguiente patrón de C# para realizar el enlace de datos.Use the following C# pattern to perform the data binding.
using (var output = await binder.BindAsync<T>(new BindingTypeAttribute(...)))
{
    ...
}

BindingTypeAttribute es el atributo de .NET que define el enlace y T es un tipo de entrada o de salida compatible con ese tipo de enlace.BindingTypeAttribute is the .NET attribute that defines your binding and T is an input or output type that's supported by that binding type. T no puede ser un tipo de parámetro out (como out JObject).T cannot be an out parameter type (such as out JObject). Por ejemplo, el enlace de salida de la tabla de Mobile Apps admite seis tipos de salida, pero solo se puede usar ICollector<T> o IAsyncCollector<T> para T.For example, the Mobile Apps table output binding supports six output types, but you can only use ICollector<T> or IAsyncCollector<T> for T.

Ejemplo de un único atributoSingle attribute example

El ejemplo de código siguiente crea un enlace de salida al blob de almacenamiento con la ruta de acceso al blob definida en tiempo de ejecución y, a continuación, escribe una cadena en el blob.The following example code creates a Storage blob output binding with blob path that's defined at run time, then writes a string to the blob.

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    using (var writer = await binder.BindAsync<TextWriter>(new BlobAttribute("samples-output/path")))
    {
        writer.Write("Hello World!!");
    }
}

BlobAttribute define el enlace de entrada o salida del blob de almacenamiento, y TextWriter es un tipo de enlace de salida admitido.BlobAttribute defines the Storage blob input or output binding, and TextWriter is a supported output binding type.

Ejemplo de varios atributosMultiple attribute example

En el ejemplo anterior se obtiene el valor de la aplicación para la cadena de conexión en la cuenta de almacenamiento principal de la aplicación de función (que es AzureWebJobsStorage).The preceding example gets the app setting for the function app's main Storage account connection string (which is AzureWebJobsStorage). Se puede especificar una configuración personalizada de la aplicación para utilizarla para la cuenta de almacenamiento agregando el atributo StorageAccountAttribute y pasando la matriz de atributos a BindAsync<T>().You can specify a custom app setting to use for the Storage account by adding the StorageAccountAttribute and passing the attribute array into BindAsync<T>(). Use un parámetro Binder, no IBinder.Use a Binder parameter, not IBinder. Por ejemplo:For example:

using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Host.Bindings.Runtime;

public static async Task Run(string input, Binder binder)
{
    var attributes = new Attribute[]
    {
        new BlobAttribute("samples-output/path"),
        new StorageAccountAttribute("MyStorageAccount")
    };

    using (var writer = await binder.BindAsync<TextWriter>(attributes))
    {
        writer.Write("Hello World!");
    }
}

En la tabla siguiente, aparecen los atributos de .NET para cada tipo de enlace, así como los paquetes en los que se definen.The following table lists the .NET attributes for each binding type and the packages in which they are defined.

EnlaceBinding AtributoAttribute Agregar referenciaAdd reference
Cosmos DBCosmos DB Microsoft.Azure.WebJobs.DocumentDBAttribute #r "Microsoft.Azure.WebJobs.Extensions.CosmosDB"
Event HubsEvent Hubs Microsoft.Azure.WebJobs.ServiceBus.EventHubAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttributeMicrosoft.Azure.WebJobs.ServiceBus.EventHubAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.Jobs.ServiceBus"
Mobile AppsMobile Apps Microsoft.Azure.WebJobs.MobileTableAttribute #r "Microsoft.Azure.WebJobs.Extensions.MobileApps"
Notification HubsNotification Hubs Microsoft.Azure.WebJobs.NotificationHubAttribute #r "Microsoft.Azure.WebJobs.Extensions.NotificationHubs"
Azure Service BusService Bus Microsoft.Azure.WebJobs.ServiceBusAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttributeMicrosoft.Azure.WebJobs.ServiceBusAttribute, Microsoft.Azure.WebJobs.ServiceBusAccountAttribute #r "Microsoft.Azure.WebJobs.ServiceBus"
Cola de almacenamientoStorage queue Microsoft.Azure.WebJobs.QueueAttribute, Microsoft.Azure.WebJobs.StorageAccountAttributeMicrosoft.Azure.WebJobs.QueueAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Blob de almacenamientoStorage blob Microsoft.Azure.WebJobs.BlobAttribute, Microsoft.Azure.WebJobs.StorageAccountAttributeMicrosoft.Azure.WebJobs.BlobAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
Tabla de almacenamientoStorage table Microsoft.Azure.WebJobs.TableAttribute, Microsoft.Azure.WebJobs.StorageAccountAttributeMicrosoft.Azure.WebJobs.TableAttribute, Microsoft.Azure.WebJobs.StorageAccountAttribute
TwilioTwilio Microsoft.Azure.WebJobs.TwilioSmsAttribute #r "Microsoft.Azure.WebJobs.Extensions.Twilio"

Pasos siguientesNext steps