Ejercicio: Creación y prueba de una instancia de Azure Functions sencilla localmente con Visual Studio

Completado

Visual Studio proporciona un entorno excelente para crear y probar una aplicación de funciones de Azure. Puede desarrollar una función de Azure localmente y comprobar que funciona correctamente antes de implementarla en la nube.

En el escenario de sitio web en línea de relojes de lujo, existe un requisito relativo a una función que devuelve información detallada sobre un reloj cuando se indica el número de modelo del reloj. Los datos que se deben devolver incluyen: el fabricante, el tipo de fondo de la caja (sólido, transparente o grabado), el bisel, el estilo de la esfera, el acabado de la caja, el número de rubíes, etc.

En este ejercicio, implementará y probará una versión de esta función localmente mediante Visual Studio.

Nota:

Antes de comenzar este ejercicio, asegúrese de que tiene VS 2022 instalado, junto con las extensiones de carga de trabajo web y en la nube Desarrollo de ASP.NET y web, y Desarrollo de Azure.

Creación de una aplicación de funciones de Azure

Cree una aplicación de funciones de Azure mediante una plantilla Azure Functions.

  1. Inicie el Instalador de Visual Studio y, en la página de inicio de Visual Studio 2022, seleccione Modificar.

  2. Asegúrese de que Desarrollo de ASP.NET y web y Desarrollo de Azure están seleccionados y disponibles (si no, seleccione Instalar durante la descarga) y seleccione Cerrar.

    Captura de pantalla de Visual Studio 2022 con las cargas de trabajo de desarrollo de ASP.NET y Azure resaltadas.

  3. En la página de inicio de Visual Studio 2022, seleccione Iniciar.

  4. En el menú Introducción, seleccione Crear un proyecto. Se abre la página Crear un proyecto.

  5. Busque o desplácese hasta la plantilla de Azure Functions y seleccione Siguiente.

    Captura de pantalla de la página Crear un proyecto de Visual Studio 2022 con la plantilla de Azure Functions resaltada.

  6. Se abre la página Configurar el nuevo proyecto. Escriba los siguientes valores:

    Campo Value
    Nombre del proyecto WatchPortalFunction
    Ubicación Seleccione una ubicación para almacenar el proyecto; para ello, vaya a una carpeta o cree una carpeta en el equipo local.
    Nombre de la solución Acepte WatchPortalFunction (valor predeterminado).
    Colocar la solución y el proyecto en el mismo directorio Desactivado (NO seleccionado). Esta configuración garantiza la estructura de carpetas correcta para este módulo.

    Captura de pantalla de la página Configurar el nuevo proyecto con Crear resaltado.

  7. Seleccione Next (Siguiente).

  8. Aparece la página Información adicional.

  9. Seleccione los siguientes valores.

    Campo Value
    Versión de .NET *.NET 6.0 (compatibilidad a largo plazo)
    Desencadenador de función Desencadenador de HTTP
    Usar Azurita para la cuenta de almacenamiento de runtime (AzureWebJobsStorage) Activada
    Habilitación de Docker Desactivado
    Nivel de autorización Anónimo

    Si una notificación de Visual Studio indica que las actualizaciones están listas, seleccione Actualizar.

  10. Seleccione Crear.

    Captura de pantalla en la que se muestran los desencadenadores de Azure Functions, con Desencadenador de HTTP resaltado.

    Visual Studio crea el proyecto WatchPortalFunction y muestra el archivo de código fuente de la aplicación de funciones Function1.cs en la ventana del editor de código. El archivo contiene el código de una clase denominada Function1.

    Como se muestra en el código de ejemplo siguiente, la clase Function1 contiene código reutilizable de la plantilla de desencadenador de HTTP. El método Run se anota con el atributo [FunctionName ("Function1")]. En la unidad anterior vimos que los parámetros reutilizables del método Run son un objeto HttpRequest que contiene los detalles de la solicitud que desencadenó la función y una entrada del registro de seguimiento para registrar la información de seguimiento.

    namespace WatchPortalFunction
    {
        public static class Function1
        {
            [FunctionName("Function1")]
            public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
            {
                log.LogInformation("C# HTTP trigger function processed a request.");
    
                string name = req.Query["name"];
    
                string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
                dynamic data = JsonConvert.DeserializeObject(requestBody);
                name = name ?? data?.name;
    
                return name != null
                    ? (ActionResult)new OkObjectResult($"Hello, {name}")
                    : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
            }
        }
    }
    

Creación de la función WatchInfo de Azure

  1. En el menú Ver, seleccione Explorador de soluciones. En la ventana Explorador de soluciones, haga clic con el botón derecho en el proyecto de Azure Functions WatchPortalFunction y, en el menú contextual, seleccione Agregar>Nueva función de Azure.

    Captura de pantalla de la ventana Explorador de soluciones. El usuario ha seleccionado Agregar -> Nueva Función de Azure.

  2. En la ventana Agregar nuevo elemento: WatchPortalFunction, seleccione Función de Azure. En el campo Nombre, escriba WatchInfo.cs y seleccione Agregar.

    Captura de pantalla de la ventana Agregar nuevo elemento. La plantilla de función de Azure está seleccionada y la nueva función se denomina WatchInfo.cs.

  3. En la ventana Nueva función de Azure: WatchInfo, seleccione Desencadenador de HTTP. En la lista desplegable Nivel de autorización, seleccione Anónimo y Agregar.

    Captura de pantalla de la ventana Nueva función de Azure. El desencadenador de HTTP con derechos de acceso anónimo está seleccionado.

    Visual Studio crea una función y el método Run se anota con el atributo [FunctionName("WatchInfo")].

  4. En el cuerpo de la función Run, elimine el código después de la línea log.LogInformation. El resultado debería tener este aspecto.

    namespace WatchPortalFunction
    {
        public static class WatchInfo
        {
            [FunctionName("WatchInfo")]
            public static async Task<IActionResult> Run(
                [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
                ILogger log)
            {
                log.LogInformation("C# HTTP trigger function processed a request.");
            }
        }
    }
    
  5. Inserte el código siguiente al final del método Run, después de la línea log.LogInformation.

    // Retrieve the model id from the query string
    string model = req.Query["model"];
    
    // If the user specified a model id, find the details of the model of watch
    if (model != null)
    {
        // Use dummy data for this example
        dynamic watchinfo = new { Manufacturer = "abc", CaseType = "Solid", Bezel = "Titanium", Dial = "Roman", CaseFinish = "Silver", Jewels = 15 };
    
        return (ActionResult)new OkObjectResult($"Watch Details: {watchinfo.Manufacturer}, {watchinfo.CaseType}, {watchinfo.Bezel}, {watchinfo.Dial}, {watchinfo.CaseFinish}, {watchinfo.Jewels}");
    }
    return new BadRequestObjectResult("Please provide a watch model in the query string");
    

    Este código lee el parámetro model de la cadena de consulta en la solicitud HTTP y devuelve los detalles de ese modelo de reloj. En este código de ejemplo, creamos datos watchinfo ficticios que se devuelven independientemente del valor de model. La función devuelve una respuesta que contiene estos detalles. O bien, si la solicitud HTTP no incluye una cadena de consulta, la función devuelve un mensaje de error. En un ejemplo real, usaría el valor model para realizar una búsqueda del watchinfo correcto por devolver.

Prueba local de la función de Azure

  1. En la barra de comandos, seleccione Depurar>Iniciar depuración.

    Visual Studio compila la aplicación de funciones de Azure e inicia el entorno de ejecución de Azure Functions. Se abre una ventana de salida para mostrar los mensajes a medida que se inicia el tiempo de ejecución. Cuando el entorno de ejecución esté listo, se muestra una lista de las funciones HTTP y la dirección URL que puede usar para desencadenar cada función.

    Captura de pantalla de la ventana Azure Functions Runtime. El entorno de ejecución inicia la aplicación de funciones de Azure y muestra las direcciones URL de

  2. Abra un explorador web y escriba la dirección URL que se muestra en la ventana en tiempo de runtime. La dirección URL predeterminada es http://localhost:7071/api/WatchInfo?model=abc, por lo que es la que se usa en este ejercicio. La solicitud desencadena la función WatchInfo y pasa el modelo abc como parámetro de la cadena de consulta. El explorador web debe mostrar los detalles ficticios generados por la función.

    Captura de pantalla de un explorador web que desencadena la función WatchInfo de Azure. La función devuelve los detalles del modelo especificado en la cadena de consulta de la dirección URL proporcionada.

  3. Escriba la dirección URL http://localhost:7071/api/WatchInfo. Esta solicitud no incluye una cadena de consulta. El desencadenador devuelve la respuesta de error y el explorador web muestra el mensaje Please provide a watch model in the query string.

  4. Cierre el explorador web, pero deje la aplicación de funciones de Azure en ejecución.

  5. En Visual Studio, establezca un punto de interrupción en la línea de código que recupera el modelo de la cadena de consulta.

    Captura de Visual Studio con un punto de interrupción en la instrucción que lee el modelo de la cadena de consulta.

  6. Reinicie el explorador web y escriba la dirección URL sin la cadena de consulta http://localhost:7071/api/WatchInfo.

    Visual Studio resalta el código en el punto de interrupción donde se pausa la ejecución.

  7. En Visual Studio, presione F10 para pasar por alto la instrucción en el punto de interrupción.

  8. En la pestaña Automático de la ventana Depurador, compruebe que la variable modeles null. La variable muestra este valor porque la cadena de consulta no contiene un parámetro de modelo.

    Captura de pantalla del depurador de Visual Studio, en el que se muestra el valor de la variable de modelo.

  9. Vuelva a presionar F10 y compruebe que el control salte a la instrucción que devuelve un objeto BadRequestObjectResult.

  10. Para seguir ejecutando el método y volver al explorador web, presione F5. Debería mostrarse el mismo mensaje de error.

  11. En el explorador web, escriba la dirección URL con una cadena de consulta y un parámetro de modelo. Pase por la función en el depurador y compruebe que el modelo se recupera correctamente. La variable model se debe rellenar con el valor del parámetro y los detalles del modelo se devuelven como objeto OkObjectResult.

  12. En la barra de menús, seleccione Depurar>Detener depuración.

En este ejercicio, ha visto cómo la extensión Azure Functions Tools en Visual Studio simplifica la experiencia de creación de una aplicación de funciones de Azure, al permitirle usar herramientas conocidas para compilar y depurar su código.