Compartir vía


Desarrollo de Azure Functions con Visual Studio

Visual Studio proporciona una manera de desarrollar, probar e implementar funciones de biblioteca de clases de C# en Azure. Si esta experiencia es la primera con Azure Functions, consulte Introducción a Azure Functions.

Antes de empezar, le recomendamos que complete la guía de inicio rápido de Functions para Visual Studio.

En este artículo se proporciona información detallada sobre cómo usar Visual Studio para desarrollar funciones de biblioteca de clases de C# y publicarlas en Azure. Hay dos modelos para desarrollar funciones de biblioteca de clases de C#: el modelo de trabajo aislado y el modelo en proceso.

Está leyendo la versión de este artículo correspondiente al modelo de trabajo aislado. Puede seleccionar el modelo preferido en la parte superior del artículo.

Está leyendo la versión en proceso del modelo de este artículo. Puede seleccionar el modelo preferido en la parte superior del artículo.

A menos que se indique lo contrario, los procedimientos y los ejemplos que se muestran son para Visual Studio 2022. Para obtener más información sobre las versiones de Visual Studio 2022, consulte las notas de la versión o las notas de la versión preliminar.

Requisitos previos

  • Visual Studio 2022, con la carga de trabajo Desarrollo de Azure.

  • Los demás recursos que necesita, como una cuenta de Azure Storage, se crean en la suscripción durante el proceso de publicación.

  • Si no tiene una cuenta de Azure, cree una cuenta gratuita antes de comenzar.

Creación de un proyecto de Azure Functions

La plantilla del proyecto de Azure Functions de Visual Studio crea un proyecto de biblioteca de clases de C# que puede publicar en una aplicación de funciones en Azure. Una aplicación de funciones permite agrupar funciones como una unidad lógica para facilitar la administración, la implementación, el escalado y el uso compartido de recursos.

  1. En el menú de Visual Studio, seleccione Archivo>Nuevo>Proyecto.

  2. En el cuadro de diálogo Crear un nuevo proyecto , escriba funciones en el cuadro de búsqueda, seleccione la plantilla de Azure Functions y, a continuación, seleccione Siguiente.

  3. En el cuadro de diálogo Configurar el nuevo proyecto , en Nombre del proyecto, escriba un nombre para el proyecto y, a continuación, seleccione Siguiente. El nombre de la aplicación de función debe ser válido como espacio de nombres de C#, por lo que no debe usar guiones bajos, guiones u otros caracteres no alfanuméricos.

  4. En el cuadro de diálogo Información adicional , realice las acciones enumeradas en la tabla siguiente:

    Configuración Acción Descripción
    Trabajo de Functions Seleccione .NET 8.0 Aislado (Soporte a largo plazo). Visual Studio crea un proyecto de función que se ejecuta en un proceso de trabajo aislado. El proceso de trabajo aislado también admite otras versiones de .NET y .NET Framework que no ofrecen compatibilidad a largo plazo (LTS). Para más información, consulte Selección de un destino para versiones de runtime de Azure Functions.
    Function Seleccione desencadenador HTTP. Visual Studio crea una función desencadenada por una solicitud HTTP.
    Uso de Azurite para la cuenta de almacenamiento en tiempo de ejecución (AzureWebJobsStorage) Seleccione esta casilla de verificación. Dado que una aplicación de funciones de Azure necesita una cuenta de almacenamiento, se asigna o se crea una cuando publica su proyecto en Azure. Un desencadenador HTTP no usa una cadena de conexión de la cuenta de almacenamiento. Todos los demás tipos de desencadenador requieren una cadena de conexión de cuenta de almacenamiento válida.
    Nivel de autorización Seleccione Anónimo. Al usar esta configuración de autorización, cualquier cliente puede desencadenar la función creada sin proporcionar una clave. Esta configuración facilita la prueba de la nueva función. Para más información, consulte Nivel de autorización.

    Recorte de pantalla del cuadro de diálogo Información adicional de Visual Studio que muestra opciones configuradas como una versión aislada de .NET para el trabajo de Functions.

    Configuración Acción Descripción
    Trabajo de Functions Seleccione .NET 8.0 En proceso (soporte técnico a largo plazo). Visual Studio crea un proyecto de función que se ejecuta en proceso con la versión 4.x del entorno de ejecución de Functions. Para más información, consulte Selección de un destino para versiones de runtime de Azure Functions.
    Function Seleccione desencadenador HTTP. Visual Studio crea una función desencadenada por una solicitud HTTP.
    Uso de Azurite para la cuenta de almacenamiento en tiempo de ejecución (AzureWebJobsStorage) Seleccione esta casilla de verificación. Dado que una aplicación de funciones de Azure necesita una cuenta de almacenamiento, se asigna o se crea una cuando publica su proyecto en Azure. Un desencadenador HTTP no usa una cadena de conexión de la cuenta de almacenamiento. Todos los demás tipos de desencadenador requieren una cadena de conexión de cuenta de almacenamiento válida.
    Nivel de autorización Seleccione Anónimo. Al usar esta configuración de autorización, cualquier cliente puede desencadenar la función creada sin proporcionar una clave. Esta configuración facilita la prueba de la nueva función. Para más información, consulte Nivel de autorización.

    Recorte de pantalla del cuadro de diálogo Información adicional de Visual Studio que muestra configuraciones como una versión de .NET en proceso para el trabajado de Functions.

    Asegúrese de establecer el Nivel de autorización en Anónimo. Si selecciona el nivel predeterminado de Función, debe presentar la clave de función en las solicitudes para acceder al punto de conexión de la función.

  5. Seleccione Crear para crear el proyecto de función y la función con desencadenador HTTP.

Después de crear un proyecto de Functions, la plantilla de proyecto crea un proyecto de C#, instala los Microsoft.Azure.Functions.Worker paquetes NuGet y Microsoft.Azure.Functions.Worker.Sdk establece la plataforma de destino.

Después de crear un proyecto de Functions, la plantilla de proyecto crea un proyecto de C#, instala el Microsoft.NET.Sdk.Functions paquete NuGet y establece la plataforma de destino.

El proyecto nuevo contiene los archivos siguientes:

  • host.json: este archivo proporciona una manera de configurar el host de Functions. Esta configuración se aplica tanto cuando se ejecuta localmente como en Azure. Para más información, consulte la referencia sobre host.json.

  • local.settings.json: este archivo mantiene la configuración que se usa al ejecutar funciones localmente. Esta configuración no se usa cuando la aplicación se ejecuta en Azure. Para obtener más información, consulte Trabajar con la configuración de la aplicación localmente.

    Importante

    Dado que el archivo local.settings.json puede contener secretos, debe excluirlo del control de código fuente del proyecto. En el cuadro de diálogo Propiedades de este archivo, asegúrese de que la opción Copiar en el directorio de salida esté establecida en Copiar si es más reciente.

Para obtener más información, consulte Estructura del proyecto en la guía de trabajo aislada.

Para más información, consulte Proyecto de biblioteca de clases de Functions.

Trabajar con la configuración de la aplicación localmente

Cuando la aplicación de funciones se ejecuta en Azure, la configuración requerida por las funciones se almacena cifrada en la configuración de la aplicación. Durante el desarrollo local, estas configuraciones se agregan a la Values colección en el archivo local.settings.json. El archivo local.settings.json también almacena la configuración que usan las herramientas de desarrollo local.

Los elementos en la colección del archivo Values de tu proyecto están diseñados para reflejar elementos en la configuración de la aplicación de función en Azure.

Visual Studio no carga automáticamente la configuración en local.settings.json al publicar el proyecto. Para asegurarse de que esta configuración también existe en la aplicación de funciones de Azure, debe cargarla después de publicar el proyecto. Para obtener más información, vea Configuración de aplicación de funciones. Los valores de una ConnectionStrings colección no se publican.

El código también puede leer los valores de configuración de la aplicación de funciones como variables de entorno. Para más información, consulte Variables de entorno.

Configuración del proyecto para el desarrollo local

El entorno de ejecución de Functions usa internamente una cuenta de almacenamiento. Durante el desarrollo, puede usar una cuenta de almacenamiento válida para esta cuenta interna o puede usar el emulador de Azurite.

Para todos los tipos de desencadenador distintos de HTTP y webhooks, debe establecer el valor de la Values.AzureWebJobsStorage clave en el archivo local.settings.json :

  • Para una cuenta de almacenamiento, establezca el valor en la cadena de conexión de la cuenta de almacenamiento.
  • Para el emulador, establezca el valor en UseDevelopmentStorage=true.

Si usa el emulador, cambie esta configuración a una cadena de conexión de la cuenta de almacenamiento real antes de la implementación. Para más información, consulte Emulador de almacenamiento local.

Para establecer la cadena de conexión de la cuenta de almacenamiento, siga estos pasos:

  1. Inicie sesión en Azure Portal y vaya a la cuenta de almacenamiento.

  2. Seleccione Seguridad y claves> red. En key1, copie el valor Cadena de conexión.

  3. En el proyecto de Visual Studio, abra el archivo local.settings.json . Establezca el valor de la AzureWebJobsStorage clave en la cadena de conexión que copió.

  4. Repita el paso anterior para agregar claves únicas a la matriz Values de cualquier otra conexión necesaria para las funciones.

Incorporación de una función al proyecto

En las funciones de biblioteca de clases de C#, los enlaces que usan las funciones se definen aplicando atributos en el código. Al crear los desencadenadores de funciones a partir de las plantillas proporcionadas, los atributos del desencadenador se aplican automáticamente.

  1. En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto y seleccione Agregar>Nueva función de Azure Functions.

  2. En el cuadro de diálogo Agregar nuevo elemento , seleccione Función de Azure y, a continuación, seleccione Agregar.

  3. Seleccione un desencadenador y establezca las propiedades de enlace necesarias. Si selecciona un desencadenador de servicio de almacenamiento y desea configurar la conexión, active la casilla para configurar la conexión del desencadenador. En el ejemplo siguiente se muestra la configuración para crear una función de desencadenador de Queue Storage.

    Recorte de pantalla del diálogo de Nueva Función de Azure para un desencadenador de cola, con el nombre de la cadena de conexión establecido en QueueStorage y la cola configurada en myqueue-items.

  4. Selecciona Agregar. Si activa la casilla para configurar una conexión de almacenamiento en el paso anterior, aparecerá la página Conectarse a dependencias . Seleccione un emulador de almacenamiento de Azurite o Azure Storage y, a continuación, seleccione Siguiente.

    • Si selecciona un emulador de almacenamiento de Azurite, aparecerá la página Conectarse al emulador de Azurite storage . Siga estos pasos:
      1. Seleccione Siguiente.
      2. En la página Resumen de cambios , seleccione Finalizar. Visual Studio configura la dependencia y crea la clase de desencadenador.
    • Si selecciona Azure Storage, aparecerá la página Conectar a Azure Storage . Siga estos pasos:
      1. Seleccione una cuenta de almacenamiento y, a continuación, seleccione Siguiente. Visual Studio intenta conectarse a su cuenta de Azure y recuperar un punto de conexión.
      2. Seleccione Siguiente.
      3. En la página Resumen de cambios , seleccione Finalizar. Visual Studio configura la dependencia y crea la clase de desencadenador.

    En este ejemplo de desencadenador se usa una configuración de aplicación para la conexión de almacenamiento con una clave denominada QueueStorage. Esta clave, almacenada en el archivolocal.settings.json, hace referencia al emulador de Azurite o a una cuenta de Storage.

  5. Examine la clase recién agregada. Por ejemplo, la siguiente clase de C# representa una función básica de desencadenador de Queue Storage:

    Un método Run() está asociado con Function. Este atributo indica que el método es el punto de entrada de la función.

    using System;
    using Azure.Storage.Queues.Models;
    using Microsoft.Azure.Functions.Worker;
    using Microsoft.Extensions.Logging;
    
    namespace Company.Function;
    
    public class QueueTriggerCSharp
    {
        private readonly ILogger<QueueTriggerCSharp> _logger;
    
        public QueueTriggerCSharp(ILogger<QueueTriggerCSharp> logger)
        {
            _logger = logger;
        }
    
        [Function(nameof(QueueTriggerCSharp))]
        public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")] QueueMessage message)
        {
            _logger.LogInformation("C# Queue trigger function processed: {messageText}", message.MessageText);
        }
    }
    

    Un método estático Run() se atribuye a FunctionName. Este atributo indica que el método es el punto de entrada de la función.

    using System;
    using Microsoft.Azure.WebJobs;
    using Microsoft.Azure.WebJobs.Host;
    using Microsoft.Extensions.Logging;
    
    namespace Company.Function
    {
        public class QueueTriggerCSharp
        {
            [FunctionName("QueueTriggerCSharp")]
            public void Run([QueueTrigger("PathValue", Connection = "ConnectionValue")]string myQueueItem, ILogger log)
            {
                log.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            }
        }
    }
    

Se aplica un atributo específico de enlace a cada parámetro de enlace que se suministra al método de punto de entrada. El atributo toma la información de enlace como parámetros.

En el código anterior, el primer parámetro tiene aplicado un QueueTrigger atributo , que indica una función de desencadenador de Queue Storage. El nombre de la cola y el valor de la cadena de conexión se pasan como parámetros en el atributo QueueTrigger. En la clase:

  • El parámetro nombre de la cola debe coincidir con el nombre de la cola que usó en un paso anterior para crear el desencadenador, como myqueue-items.
  • El nombre de la configuración de la cadena de conexión debe coincidir con el que se usa en un paso anterior para crear el desencadenador, como QueueStorage.

Para más información, consulte Desencadenador de Azure Queue Storage para Azure Functions.

Use el procedimiento anterior para agregar más funciones al proyecto de aplicación de funciones. Cada función del proyecto puede tener un desencadenador diferente, pero una función no puede tener más de un desencadenador. Para más información, consulte Desencadenadores y enlaces de Azure Functions.

Adición de enlaces

Al igual que sucede con los desencadenadores, los enlaces de entrada y salida se agregan a la función como atributos de enlace. Para agregar enlaces a una función, siga estos pasos:

  1. Asegúrese de que configura el proyecto para desarrollo local.

  2. Agregue el paquete de extensión NuGet adecuado para cada enlace específico. Para conocer los requisitos de paquetes NuGet específicos del enlace, consulte el artículo de referencia sobre el enlace. Por ejemplo, para conocer los requisitos de paquetes para el desencadenador de Azure Event Hubs, consulte Desencadenador y enlaces de Azure Event Hubs para Azure Functions.

  3. Use el siguiente comando en la consola de Administrador de paquetes para instalar un paquete específico:

    Install-Package Microsoft.Azure.Functions.Worker.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>
    
    Install-Package Microsoft.Azure.WebJobs.Extensions.<BINDING_TYPE> -Version <TARGET_VERSION>
    

    En este código, reemplace por <BINDING_TYPE> el nombre específico de la extensión de enlace y reemplace por <TARGET_VERSION> una versión específica del paquete, como 4.0.0. Las versiones válidas se enumeran en las páginas individuales del paquete en NuGet.org.

  4. Si hay valores de la aplicación que el enlace necesita, agréguelos a la colección Values del archivo de configuración local.

    La función usa estos valores cuando se ejecuta localmente. Cuando la función se ejecuta en la aplicación de funciones en Azure, usa los valores de la aplicación de funciones. Visual Studio facilita publicar la configuración local en Azure.

  5. Agregue el atributo de enlace apropiado para la firma del método. En el código siguiente, un mensaje de cola desencadena la función Run. A continuación, el enlace de salida crea un nuevo mensaje de cola con el mismo texto en otra cola.

     public class QueueTrigger
    {
        private readonly ILogger _logger;
    
        public QueueTrigger(ILoggerFactory loggerFactory)
        {
            _logger = loggerFactory.CreateLogger<QueueTrigger>();
        }
    
        [Function("CopyQueueMessage")]
        [QueueOutput("myqueue-items-destination", Connection = "QueueStorage")]
        public string Run([QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem)
        {
            _logger.LogInformation($"C# Queue trigger function processed: {myQueueItem}");
            return myQueueItem;
        }
    }
    

    El atributo QueueOutput define el enlace en el método. En el caso de varios enlaces de salida, coloque en su lugar este atributo en una propiedad de cadena de texto del objeto devuelto. Para más información, consulte Varios enlaces de salida.

    public static class SimpleExampleWithOutput
    {
        [FunctionName("CopyQueueMessage")]
        public static void Run(
            [QueueTrigger("myqueue-items-source", Connection = "QueueStorage")] string myQueueItem, 
            [Queue("myqueue-items-destination", Connection = "QueueStorage")] out string myQueueItemCopy,
            ILogger log)
        {
            log.LogInformation($"CopyQueueMessage function processed: {myQueueItem}");
            myQueueItemCopy = myQueueItem;
        }
    }
    

    El atributo Queue del parámetro out define el enlace de salida.

    La conexión con Queue Storage se obtiene del valor QueueStorage. Para más información, consulte el artículo de referencia del enlace concreto.

Para obtener una lista completa de los enlaces admitidos por Functions, consulte Enlaces admitidos. Para obtener un ejemplo más completo de este escenario, consulte Conexión de funciones a Azure Storage mediante Visual Studio.

Ejecución local de funciones

Puede usar Azure Functions Core Tools para ejecutar proyectos de Functions en el equipo de desarrollo local. Al seleccionar F5 para depurar un proyecto de Functions, el host local de Functions (func.exe) comienza a escuchar en un puerto local (normalmente 7071). Los puntos de conexión de función a los que se puede llamar se escriben en la salida y puede usarlos para probar las funciones. Para más información, consulte Desarrollo de Azure Functions localmente mediante Core Tools. La primera vez que inicie una función desde Visual Studio Code se le solicitará que instale estas herramientas.

Importante

A partir de la versión 4.0.6517 de Core Tools, los proyectos de modelos en proceso deben hacer referencia a la versión 4.5.0 o posterior de Microsoft.NET.Sdk.Functions. Si usa una versión anterior, el func start comando genera un error.

Para iniciar la función en Visual Studio en modo de depuración, siga estos pasos:

  1. Seleccione F5. Si se le solicita, acepte la solicitud de Visual Studio para descargar e instalar Azure Functions Core Tools. Es posible que también tenga que activar una excepción de firewall para que las herramientas puedan controlar las solicitudes HTTP.

  2. Cuando se ejecute el proyecto, pruebe el código de la misma manera que prueba una función implementada.

    Cuando Visual Studio se ejecuta en modo de depuración, los puntos de interrupción se alcanzan de la forma esperada.

Para obtener un escenario de prueba más detallado que usa Visual Studio, consulte Funciones de prueba, más adelante en este artículo.

Publicación en Azure

Al publicar el proyecto de Functions en Azure, Visual Studio usa la implementación zip para implementar los archivos de proyecto. Cuando sea posible, también debe seleccionar Ejecutar desde el archivo de paquete para que el proyecto se ejecute en el paquete de implementación (.zip). Para más información, consulte Ejecución de las funciones desde un archivo de paquete en Azure.

No implemente en Functions mediante Web Deploy (msdeploy).

Siga estos pasos para publicar el proyecto en una aplicación de funciones en Azure:

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Publicar.

  2. En la página Publicar , realice las siguientes selecciones:

    • En Destino, seleccione Azure y, a continuación, seleccione Siguiente.
    • En Destino específico, seleccione Aplicación de funciones de Azure y, a continuación, seleccione Siguiente.
    • En la instancia de Functions, seleccione Crear nuevo.

    Captura de pantalla de la página Publicar. En la sección Instancia de Funciones, un grupo de recursos se puede ver y Crear nuevo está resaltado.

  3. Cree una nueva instancia con los valores especificados en la siguiente tabla:

    Configuración Valor Descripción
    Nombre Un nombre único global El nombre debe identificar de forma única la nueva aplicación de funciones. Acepte el nombre sugerido o escriba un nombre nuevo. Los caracteres siguientes son válidos: a-z, 0-9y -.
    Nombre de la suscripción Nombre de la suscripción La aplicación de funciones se crea en una suscripción de Azure. Acepte la suscripción predeterminada o seleccione una diferente de la lista.
    Grupo de recursos Nombre del grupo de recursos La aplicación de funciones se crea en un grupo de recursos. Seleccione Nuevo para crear un nuevo grupo de recursos. También puede seleccionar un grupo de recursos existente en la lista.
    Tipo de plan Consumo flexible Al publicar el proyecto en una aplicación de funciones que se ejecuta en un plan de consumo flexible, es posible que solo pague por las ejecuciones de la aplicación de funciones. Otros planes de hospedaje pueden incurrir en costos mayores.
    IMPORTANTE:
    Al crear un plan de Flex Consumption, primero debe seleccionar Plan de App Service y luego volver a seleccionar Flex Consumption para resolver un problema con el cuadro de diálogo.
    Sistema operativo Linux Actualmente, el plan flex Consumption requiere Linux.
    Ubicación Ubicación del servicio de aplicaciones Seleccione una ubicación en una región de Azure compatible con el plan de consumo flexible. Cuando se selecciona una región no admitida, el botón Crear aparece atenuado.
    Tamaño de memoria de instancia 2048 El tamaño de memoria de las instancias de máquina virtual en las que se ejecuta la aplicación es único para el plan de consumo flexible.
    Azure Storage Una cuenta de almacenamiento de uso general El entorno de ejecución de Functions requiere una cuenta de almacenamiento. Seleccione Nueva para configurar una cuenta de almacenamiento de uso general. También puede usar una cuenta existente que cumpla los requisitos de la cuenta de almacenamiento.
    Application Insights Una instancia de Application Insights Debe activar la integración de Application Insights para la aplicación de funciones. Seleccione Nuevo para crear una nueva instancia, ya sea en un área de trabajo de Log Analytics nueva o en una existente. También puede usar una instancia existente.

    Captura de pantalla del cuadro de diálogo Crear nueva aplicación de funciones. Los campos del nombre, la suscripción, el grupo de recursos, el plan y otras opciones de configuración se rellenan.

  4. Seleccione Crear para crear una aplicación de funciones y sus recursos relacionados en Azure. El estado de la creación del recurso se muestra en la equina inferior izquierda de la ventana.

  5. Selecciona Finalizar. Aparece la ventana progreso de creación del perfil de publicación. Cuando se cree el perfil, seleccione Cerrar.

  6. En la página Perfil de publicación, seleccione Publicar para implementar el paquete que contiene los archivos del proyecto en la nueva aplicación de funciones de Azure.

    Una vez completada la implementación, la dirección URL raíz de la aplicación de funciones en Azure se muestra en la página del perfil de publicación.

  7. En la página de perfil de publicación, vaya a la sección Hospedaje. Seleccione los puntos suspensivos (...) y, a continuación, seleccione Abrir en Azure Portal. El nuevo recurso de Azure de la aplicación de funciones se abre en Azure Portal.

    Recorte de pantalla de la página de perfil de publicación. En la sección Hosting, el menú contextual de puntos suspensivos está abierto y Abrir en Azure Portal está resaltado.

Configuración de Function App

Visual Studio no carga automáticamente la configuración de la aplicación al publicar el proyecto. Si agrega la configuración al archivo local.settings.json , también debe agregarlos a la aplicación de funciones en Azure.

La manera más fácil de cargar la configuración necesaria en la aplicación de funciones en Azure es administrarlos en Visual Studio. En la página de perfil de publicación, vaya a la sección Hospedaje. Seleccione los puntos suspensivos (...) y, a continuación, seleccione Administrar la configuración de Azure App Service.

Recorte de pantalla de la sección Hosting de la página de perfil de publicación. El menú contextual de puntos suspensivos está abierto y la configuración de Administración de Azure App Service está resaltada.

Al realizar la selección, se abre el cuadro de diálogo Configuración de la aplicación para la aplicación de funciones. Puede usar este cuadro de diálogo para agregar la configuración de la aplicación o modificar las existentes.

Captura de pantalla del cuadro de diálogo Configuración de la aplicación que muestra valores locales y remotos para varias opciones de configuración y controles para agregar y editar valores.

Para cada configuración, el valor local es el valor del archivo local.settings.json y el valor remoto es el valor de la aplicación de funciones en Azure.

  • Para crear una configuración de aplicación, seleccione Agregar configuración.
  • Para copiar un valor de configuración desde el campo Local al campo Remoto , seleccione Insertar valor en Local.

Los cambios pendientes se escriben en el archivo de configuración local y la aplicación de función cuando se selecciona Aceptar.

Nota:

De forma predeterminada, el archivo local.settings.json no se ha insertado en el control de código fuente. Como resultado, si clona un proyecto de Functions local desde el control de código fuente, el proyecto no tiene un archivo local.settings.json . Debe crear manualmente el archivo local.settings.json en la raíz del proyecto para que el cuadro de diálogo Configuración de la aplicación funcione según lo previsto.

También puede administrar la configuración de la aplicación en una de estas otras maneras:

Depuración remota

Para depurar la aplicación de funciones de forma remota, es preciso publicar una configuración de depuración del proyecto. También debe habilitar la depuración remota en su aplicación de funciones en Azure.

En esta sección se supone que se publica una configuración de depuración para su aplicación de funciones.

Consideraciones sobre la depuración remota

  • No se recomienda la depuración remota en servicios de producción.
  • Para usar la depuración remota, debe hospedar la aplicación de funciones en un Plan Premium o de App Service.
  • La depuración remota solo se admite actualmente al ejecutar su aplicación de C# en Windows.
  • Si tiene la característica Just My Code activada en Visual Studio, desactive esta opción. Para obtener instrucciones, consulte Habilitar o deshabilitar Solo mi código.
  • Evite detenciones prolongadas en los puntos de interrupción cuando use la depuración remota. Cuando un proceso se detiene durante más de unos minutos, Azure lo trata como un proceso que no responde y lo cierra.
  • Mientras realiza la depuración, el servidor envía datos a Visual Studio, lo que puede afectar a los cargos de ancho de banda. Para obtener información sobre las tarifas de ancho de banda, consulte Calculadora de precios.
  • La depuración remota se desactiva automáticamente en la aplicación de funciones después de las 48 horas. Después de ese punto, debe activar de nuevo la depuración remota.

Asociar el depurador

Al depurar una aplicación de proceso de trabajo aislada, actualmente debe asociar el depurador remoto a un proceso de .NET independiente. También se requieren otros pasos de configuración.

Para asociar un depurador remoto a una aplicación de funciones que se ejecuta en un proceso independiente del host de Functions, siga estos pasos:

  1. En la página de perfil de publicación, vaya a la sección Hospedaje. Seleccione los puntos suspensivos (...) y, a continuación, seleccione Adjuntar depurador.

    Visual Studio se conecta a la aplicación de funciones y activa la depuración remota, en caso de que aún no esté activada.

    Nota:

    Dado que el depurador remoto no se puede conectar al proceso de host, es posible que aparezca un mensaje de error. En cualquier caso, el depurador local no puede acceder a los puntos de interrupción ni proporcionar una manera de inspeccionar variables o recorrer el código.

  2. En el menú Depurar de Visual Studio, seleccione Asociar al proceso.

  3. En el cuadro de diálogo Asociar al proceso , siga estos pasos:

    1. Junto a Tipo de conexión, seleccione Microsoft Azure App Services.
    2. Junto a Destino de conexión, seleccione Buscar.
  4. En el cuadro de diálogo Asociar a proceso de Azure, busque y seleccione su aplicación de funciones y, a continuación, seleccione Aceptar.

  5. Si se le solicita, permita que Visual Studio acceda a través de un firewall local.

  6. De nuevo en el cuadro de diálogo Asociar al proceso , seleccione Mostrar procesos para todos los usuarios. Seleccione dotnet.exey, a continuación, seleccione Asociar.

    Captura de pantalla del cuadro de diálogo Asociar al proceso. El tipo de conexión es Microsoft Azure App Services. En la tabla de procesos, se selecciona dotnet.exe.

Cuando finalice la operación, estarás conectado al código de la biblioteca de clases de C# que se ejecuta en un proceso de trabajo aislado. En este momento, puede depurar la aplicación de funciones de forma normal.

Para asociar un depurador remoto a una aplicación de funciones que se ejecuta en proceso con el host de Functions, siga estos pasos.

En la página de perfil de publicación, vaya a la sección Hospedaje. Seleccione los puntos suspensivos (...) y, a continuación, seleccione Adjuntar depurador.

Visual Studio se conecta a la aplicación de funciones y activa la depuración remota, en caso de que aún no esté activada. También localiza y conecta el depurador al proceso de host de la aplicación. En este momento, puede depurar la aplicación de funciones de forma normal.

Debe desactivar la depuración remota cuando termine de depurar.

Desactivar la depuración remota

Después de finalizar la depuración remota del código, debe desactivar la depuración remota en Azure Portal. La depuración remota se desactiva automáticamente después de 48 horas, en caso de que se olvide.

  1. En la página de perfil de publicación, vaya a la sección Hospedaje. Seleccione los puntos suspensivos (...) y, a continuación, seleccione Abrir en Azure Portal. Azure Portal se abre en la aplicación de funciones en la que se implementa el proyecto.

  2. En la aplicación de funciones, seleccione Configuración>Configuración, y a continuación, vaya a la pestaña Configuración general. Junto a Depuración remota, seleccione Desactivado. Seleccione Guardar y, a continuación, seleccione Continuar.

Una vez que se reinicie la aplicación de funciones, no podrá conectarse de forma remota a los procesos remotos. Puede usar esta misma pestaña en Azure Portal para activar la depuración remota fuera de Visual Studio.

Monitoreo de funciones

La manera recomendada de supervisar las funciones es integrar la aplicación de funciones con Application Insights. Debe activar esta integración al crear tu aplicación de funciones durante la publicación desde Visual Studio.

Si la integración no está configurada durante la publicación por algún motivo, debería activar la integración de Application Insights para su aplicación de funciones en Azure.

Para más información sobre el uso de Application Insights para la supervisión, consulte Supervisión de ejecuciones en Azure Functions.

Funciones de prueba

En esta sección se describe cómo crear un proyecto de modelo en proceso de C# que puede probar mediante xUnit, una herramienta de pruebas unitarias de código abierto para .NET.

Paso 1: Configuración

Siga estos pasos para configurar el entorno, incluido el proyecto de aplicación y las funciones, necesarios para admitir las pruebas:

  1. En Visual Studio, cree un proyecto de Azure Functions denominado Functions.

  2. Cree una función HTTP a partir de la plantilla:

    1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto Functions y seleccione Agregar>nueva función de Azure.
    2. En el cuadro de diálogo Agregar nuevo elemento , seleccione Función de Azure y, a continuación, seleccione Agregar.
    3. Seleccione Desencadenador Http y, a continuación, seleccione Agregar.
    4. Cambie el nombre de la nueva clase MyHttpTrigger.
  3. Cree una función de temporizador a partir de la plantilla:

    1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto Functions y seleccione Agregar>nueva función de Azure.
    2. En el cuadro de diálogo Agregar nuevo elemento , seleccione Función de Azure y, a continuación, seleccione Agregar.
    3. Seleccione Desencadenador de temporizador y, a continuación, seleccione Agregar.
    4. Cambie el nombre de la nueva clase MyTimerTrigger.
  4. Cree una aplicación de prueba de xUnit en la solución:

    1. En el Explorador de soluciones, haga clic con el botón derecho en la solución que contiene el proyecto de Functions y seleccione Agregar>nuevo proyecto.
    2. Seleccione la plantilla xUnit Test Project (Proyecto de prueba de xUnit ) y, a continuación, seleccione Siguiente.
    3. Asigne al proyecto el nombre Functions.Tests.
  5. Quite los archivos de prueba predeterminados del proyecto Functions.Tests .

  6. Use NuGet para agregar una referencia de la aplicación de prueba a Microsoft.AspNetCore.Mvc. Puede usar la consola del Administrador de paquetes o puede realizar los pasos siguientes:

    1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto Functions.Tests y seleccione Administrar paquetes NuGet.
    2. Busque e instale Microsoft.AspNetCore.Mvc.
  7. En la aplicación Functions.Tests , agregue una referencia a la aplicación de Functions :

    1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto Functions.Tests y seleccione Agregar>referencia de proyecto.
    2. Seleccione el proyecto Functions y, a continuación, seleccione Aceptar.

Paso 2: Crear clases de prueba

En esta sección, creará las clases que se usan para ejecutar las pruebas automatizadas.

Cada función toma una implementación de ILogger para manejar el registro de mensajes. En algunas pruebas, no se registra ningún mensaje o no importa cómo se implementa el registro. Otras pruebas deben evaluar los mensajes registrados para determinar si se debe superar una prueba.

  1. Cree una clase en el proyecto Functions.Tests denominado NullScope y agregue el código siguiente. Esta clase proporciona un alcance simulado. En un paso posterior, creará una implementación de ILogger que usa este ámbito.

    using System;
    
    namespace Functions.Tests
    {
        public class NullScope : IDisposable
        {
            public static NullScope Instance { get; } = new NullScope();
    
            private NullScope() { }
    
            public void Dispose() { }
        }
    }
    
  2. Cree una clase en el proyecto Functions.Tests denominado ListLogger y agregue el código siguiente. Esta clase mantiene una lista interna de mensajes que se van a evaluar durante las pruebas. Para implementar la interfaz necesaria ILogger , la clase usa el ámbito ficticio de la NullScope clase . Los casos de prueba pasan el ámbito ficticio a la clase ListLogger.

    using Microsoft.Extensions.Logging;
    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Functions.Tests
    {
        public class ListLogger : ILogger
        {
            public IList<string> Logs;
    
            public IDisposable BeginScope<TState>(TState state) => NullScope.Instance;
    
            public bool IsEnabled(LogLevel logLevel) => false;
    
            public ListLogger()
            {
                this.Logs = new List<string>();
            }
    
            public void Log<TState>(LogLevel logLevel,
                                    EventId eventId,
                                    TState state,
                                    Exception exception,
                                    Func<TState, Exception, string> formatter)
            {
                string message = formatter(state, exception);
                this.Logs.Add(message);
            }
        }
    }
    

    La ListLogger clase implementa los siguientes miembros, según el contrato de la ILogger interfaz:

    • BeginScope: Los ámbitos agregan contexto al registro. En este caso, la prueba apunta a la instancia estática de la NullScope clase para permitir que la prueba funcione.
    • IsEnabled: se proporciona un valor predeterminado de false .
    • Log: este método usa la función proporcionada formatter para dar formato al mensaje. A continuación, el método agrega el texto resultante a la Logs colección.

    La colección Logs es una instancia de List<string> y se inicializa en el constructor.

  3. Cree un archivo de código en el proyecto Functions.Tests denominado LoggerTypes.cs y agregue el código siguiente:

    namespace Functions.Tests
    {
        public enum LoggerTypes
        {
            Null,
            List
        }
    }
    

    Esta enumeración especifica el tipo de registrador que usan las pruebas.

  4. Cree una clase en el proyecto Functions.Tests denominado TestFactory y agregue el código siguiente:

    using Microsoft.AspNetCore.Http;
    using Microsoft.AspNetCore.Http.Internal;
    using Microsoft.Extensions.Logging;
    using Microsoft.Extensions.Logging.Abstractions;
    using Microsoft.Extensions.Primitives;
    using System.Collections.Generic;
    
    namespace Functions.Tests
    {
        public class TestFactory
        {
            public static IEnumerable<object[]> Data()
            {
                return new List<object[]>
                {
                    new object[] { "name", "Bernardo" },
                    new object[] { "name", "Ananya" },
                    new object[] { "name", "Vlad" }
    
                };
            }
    
            private static Dictionary<string, StringValues> CreateDictionary(string key, string value)
            {
                var qs = new Dictionary<string, StringValues>
                {
                    { key, value }
                };
                return qs;
            }
    
            public static HttpRequest CreateHttpRequest(string queryStringKey, string queryStringValue)
            {
                var context = new DefaultHttpContext();
                var request = context.Request;
                request.Query = new QueryCollection(CreateDictionary(queryStringKey, queryStringValue));
                return request;
            }
    
            public static ILogger CreateLogger(LoggerTypes type = LoggerTypes.Null)
            {
                ILogger logger;
    
                if (type == LoggerTypes.List)
                {
                    logger = new ListLogger();
                }
                else
                {
                    logger = NullLoggerFactory.Instance.CreateLogger("Null Logger");
                }
    
                return logger;
            }
        }
    }
    

    La clase TestFactory implementa los siguientes miembros:

    • Data: esta propiedad devuelve una colección IEnumerable de datos de ejemplo. Los pares clave-valor representan valores que se pasan a una cadena de consulta.
    • CreateDictionary: este método acepta un par clave-valor como argumento. Devuelve una nueva instancia de Dictionary que se utiliza para crear una instancia de QueryCollection para representar los valores de cadena de consulta.
    • CreateHttpRequest: este método crea una solicitud HTTP que se inicializa con los parámetros de cadena de consulta especificados.
    • CreateLogger: este método devuelve una implementación de ILogger que se usa para las pruebas. La ILogger implementación depende del tipo de registrador especificado. Si se especifica un tipo de lista, la ListLogger instancia realiza un seguimiento de los mensajes registrados que están disponibles para su evaluación en las pruebas.
  5. Cree una clase en el proyecto Functions.Tests denominado FunctionsTests y agregue el código siguiente:

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    using Xunit;
    
    namespace Functions.Tests
    {
        public class FunctionsTests
        {
            private readonly ILogger logger = TestFactory.CreateLogger();
    
            [Fact]
            public async void Http_trigger_should_return_known_string()
            {
                var request = TestFactory.CreateHttpRequest("name", "Bernardo");
                var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
                Assert.Equal("Hello, Bernardo. This HTTP triggered function executed successfully.", response.Value);
            }
    
            [Theory]
            [MemberData(nameof(TestFactory.Data), MemberType = typeof(TestFactory))]
            public async void Http_trigger_should_return_known_string_from_member_data(string queryStringKey, string queryStringValue)
            {
                var request = TestFactory.CreateHttpRequest(queryStringKey, queryStringValue);
                var response = (OkObjectResult)await MyHttpTrigger.Run(request, logger);
                Assert.Equal($"Hello, {queryStringValue}. This HTTP triggered function executed successfully.", response.Value);
            }
    
            [Fact]
            public void Timer_should_log_message()
            {
                var logger = (ListLogger)TestFactory.CreateLogger(LoggerTypes.List);
                new MyTimerTrigger().Run(null, logger);
                var msg = logger.Logs[0];
                Assert.Contains("C# Timer trigger function executed at", msg);
            }
        }
    }
    

    Esta clase implementa los siguientes miembros:

    • Http_trigger_should_return_known_string: esta prueba usa el valor name=Bernardo de cadena de consulta para crear una solicitud a una función HTTP. Esta prueba comprueba que se devuelve la respuesta esperada.
    • Http_trigger_should_return_string_from_member_data: esta prueba usa atributos xUnit para proporcionar datos de ejemplo a la función HTTP.
    • Timer_should_log_message: esta prueba crea una instancia de ListLogger y la pasa a una función de temporizador. Una vez que se ejecuta la función, se comprueba el registro para asegurarse de que el mensaje esperado está presente.
  6. Para acceder a la configuración de la aplicación en las pruebas, puede insertar una IConfiguration implementación con valores ficticios de variables de entorno en la función.

Paso 3: Ejecutar pruebas

Para ejecutar las pruebas en Visual Studio, seleccione Ver>explorador de pruebas. En el Explorador de pruebas, seleccione Ejecutar>todas las pruebas en la vista.

Captura de pantalla de Visual Studio. El Explorador de pruebas muestra que se han superado cinco pruebas. En el Explorador de soluciones, los proyectos Functions y Functions.Test están visibles.

Paso 4: Depurar pruebas

Para depurar las pruebas, establezca un punto de interrupción en una prueba. En el Explorador de pruebas, seleccione Ejecutar>Depurar última ejecución.