Desarrollo con . Servicios de almacenamiento de red y Azure | Trevoir Williams | Skillshare
Buscar

Velocidad de reproducción


1.0x


  • 0.5x
  • 0.75x
  • 1x (Normal)
  • 1.25x
  • 1.5x
  • 1.75x
  • 2x

Desarrollo con . Servicios de almacenamiento de red y Azure

teacher avatar Trevoir Williams, Jamaican Software Engineer

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Ve esta clase y miles más

Obtenga acceso ilimitado a todas las clases
Clases enseñadas por líderes de la industria y profesionales activos
Los temas incluyen ilustración, diseño, fotografía y más

Lecciones en esta clase

    • 1.

      Introducción

      0:34

    • 2.

      Comprender el almacenamiento de Azure

      5:33

    • 3.

      Comprensión de almacenamiento de la tabla y de la cola

      2:58

    • 4.

      Crear una cuenta de almacenamiento de Azure

      4:41

    • 5.

      Emulador de almacenamiento de Azure

      1:36

    • 6.

      Administración de cuentas

      11:35

    • 7.

      Explorador de almacenamiento

      1:17

    • 8.

      Resumen de la aplicación web

      1:22

    • 9.

      Crear y configurar . Proyecto básico de red

      4:12

    • 10.

      Agregar servicio de almacenamiento de tablas

      10:21

    • 11.

      Crear controladores y vistas

      11:57

    • 12.

      CRUD de almacenamiento de la mesa

      4:23

    • 13.

      Agregar servicio de carga de Blob

      15:12

    • 14.

      Características de servicio de prueba de Blob

      13:03

    • 15.

      Agregar servicio de cola

      6:10

    • 16.

      Servicio de colas

      2:07

    • 17.

      Logs y llamadas de servicios

      1:47

    • 18.

      Configurar el lector de mensajes de cola

      11:16

    • 19.

      Limpieza de códigos y optimización

      13:19

    • 20.

      Conclusión

      1:43

  • --
  • Nivel principiante
  • Nivel intermedio
  • Nivel avanzado
  • Todos los niveles

Generado por la comunidad

El nivel se determina según la opinión de la mayoría de los estudiantes que han dejado reseñas en esta clase. La recomendación del profesor o de la profesora se muestra hasta que se recopilen al menos 5 reseñas de estudiantes.

9

Estudiantes

--

Proyecto

Acerca de esta clase

Este curso completo, "Desarrollar con . Servicios de almacenamiento de NET y Azure", está diseñado para desarrolladores de software que quieren mejorar sus habilidades para construir y administrar aplicaciones modernas con Microsoft. Servicios de almacenamiento de red y Azure. Al sumergirse en los escenarios y las mejores prácticas del mundo, los estudiantes obtendrán el conocimiento y la experiencia necesarios para aprovechar el potencial de estas tecnologías poderosas.

A lo largo de este curso práctico, los participantes explorarán varios servicios de almacenamiento de Azure, como el almacenamiento de blob, el almacenamiento de tablas y el almacenamiento de colas, mientras aprenderás a integrarlos con . Aplicaciones en red. Los estudiantes serán competentes en crear, configurar y desplegar aplicaciones robustas y habilitadas en la nube con Microsoft. framework, C#, y servicios de almacenamiento de Azure.

Conoce a tu profesor(a)

Teacher Profile Image

Trevoir Williams

Jamaican Software Engineer

Profesor(a)
Level: Intermediate

Valoración de la clase

¿Se cumplieron las expectativas?
    ¡Superadas!
  • 0%
  • 0%
  • Un poco
  • 0%
  • No realmente
  • 0%

¿Por qué unirse a Skillshare?

Mira las galardonadas Skillshare Originals

Cada clase tiene lecciones cortas y proyectos prácticos

Tu membresía apoya a los profesores de Skillshare

Aprende desde cualquier lugar

Ve clases sobre la marcha con la aplicación de Skillshare. Progresa en línea o descarga las clases para verlas en el avión, el metro o donde sea que aprendas mejor.

Transcripciones

1. Introducción: En este módulo, vamos a estar viendo como tus cuentas de almacenamiento. Para este lunes, vamos a explorar las ofertas de cuentas de almacenamiento de Azure. Vamos a ver Almacenamiento en Mesa de Almacenamiento de Blob , Almacenamiento en cola. Y en última instancia vamos a desarrollar una solución que interactuará con cada uno de estos componentes del almacenamiento de Azure. Entonces, como de costumbre, vamos a seguir adelante y crear nuestro almacenamiento o conos. Mira las diferentes opciones y explora todos los matices, y explora cómo puedes integrar estas ofertas en nuestras propias soluciones. Así que estén atentos. Este va a ser un módulo divertido. 2. Comprender el almacenamiento de Azure: Para comenzar, vamos a empezar por mirar las ofertas de almacenamiento de Azure Blob. Ahora, Azure Blob Storage es un servicio basado en la nube para almacenar datos no estructurados como archivos de texto, imágenes, videos, etc. Es una solución escalable y segura y muy rentable para almacenar grandes cantidades de datos. Y es compatible con funciones de seguridad como cifrado, autenticación y autorización. Hay integración integrada para Azure AD y sus datos se cifrarán tanto en movimiento como en reposo. Se puede acceder a los datos a través protocolos HTTP o HTTPS en cualquier parte del mundo, y eso los convierte en un candidato adecuado para cosas CDN. Entonces CBN, esas letras significan Red de Entrega de Contenidos. Entonces, debido a esta flexibilidad, Blob Storage es perfecto para eso. Integrar o construir aplicaciones para soportar la oferta de almacenamiento Blob es muy fácil si estás usando dotnet, Ruby , Java, Python y varios otros frameworks, siempre puedes ir y buscar si el framework apropiado está ahí para tu referencia. Pero claro que son puntajes de desarrolladores de dotnet y nos tiene cubiertos. Ahora se usa comúnmente para escenarios en los que queremos servir imágenes o documentos directamente al navegador. Necesitamos facilitar el acceso distribuido a un conjunto de documentos. Si quieres transmitir contenido como video y audio, si quieres almacenar archivos de registro y continuamente derecho, a esos archivos de registro. O si queremos almacenar datos para backup, recuperación ante desastres y archivado. Sepa si le gusta la ciencia de datos y el big data, dará cuenta de que existe una oferta llamada Azure Data Lake Storage Gen2, que es la solución de análisis de big data empresarial de Microsoft para la nube. Esto ofrece un sistema de archivos jerárquico, así como las ventajas del almacenamiento de Blob. Y esas ventajas incluyen el hecho de que es de bajo costo, tiene disponibilidad de almacenamiento de información en niveles, fuerte consistencia y capacidades de recuperación ante desastres. Ahora acabamos de mencionar los niveles de almacenamiento. Por lo que hay tres tipos de niveles de almacenamiento. El primero que miramos, este nivel de almacenamiento caliente y caliente se usa para analistas de datos de acceso frecuente. Verás que son las opciones más costosas. Entonces, si sabes que siempre vas al almacenamiento de Blob para acceder a este archivo, tal vez videos que se están transmitiendo, audio que se está transmitiendo. Entonces lo querrías en el nivel de almacenamiento caliente. Luego tenemos el nivel de almacenamiento genial, que se usa para datos de acceso menos frecuente. Y claro que es un poco menos costoso que el caliente porque el tráfico no está ahí contra el archivo o archivos. Así que cada vez que intentas acceder a un archivo, puede tardar un poco más en cargarlo. Pero claro esto es mejor para los archivos que se van a almacenar a largo plazo y con los que no se interactúa tanto. Entonces tenemos el nivel de archivo, y esto es para unos datos raramente accedidos. Entonces esto es para archivos que en términos generales, las organizaciones necesitan conservar archivos o mantener registros hasta por siete años. Bien, así que querrías archivar archivos tal vez después del tercer año puedas ponerlos en el almacenamiento de archivos porque no vas a estar accediendo tanto a ellos. Y si vas al acceso, va a tardar mucho más. Va a tener que rehidratar ese archivo o ese blob, entonces lo traería de vuelta. Entonces, por supuesto, eso se usa para copias de seguridad extendidas y es la opción menos costosa. Ahora un almacenamiento de dos puntos tiene al menos dos componentes principales que se ven en todos los demás tipos de almacenamiento. Pero como estamos hablando de gotas, voy a adaptar la inflamación en relación con las gotas. Lo primero que tienes son las cuentas reales. Ahora bien, esto proporciona un espacio de nombres en Azure para tus datos y cada objeto que use almacenado en Azure Storage tendría una dirección que incluye este nombre de cuenta único. Entonces tenemos el contenedor y nuestro contenedor organiza todas las blobs manera similar a como esperarías que un sistema de archivos como Windows o Linux organice tus archivos. Obtienes ese tipo de jerarquía de estructura de carpetas disponible para ti en nuestro contenedor. Entonces el blob representa un archivo físico que se almacena dentro del contenedor. Hay un diagrama que muestra esa jerarquía. Varios tipos de gotas son. Blob es un blob, quiero decir, es un archivo que se almacena en este almacenamiento o conos, pero luego diferentes blobs necesitan ser tratados de manera diferente por diferentes razones. Entonces el primero que tenemos es un blob de bloque, que probablemente sea el más común. Lo usamos para almacenar texto o datos binarios. Y está conformada por bloques de datos que pueden almacenar hasta 190.7 trilobites, no terror, sino bytes de Tilly. Entonces tenemos gotas anexadas. Ahora bien, esto sí tiene bloques similares a los blobs de bloque. Bueno, están optimizados para la operación de anexar. Así que esto sería ideal para un escenario en el que necesitamos estar registrando datos desde una máquina virtual o en tu App Service. Si recuerdas, cuando estamos sentados en el registro de App Service, podríamos haber elegido iniciar sesión en un blob, ¿verdad? Entonces esto es lo que usaríamos. Se proveería un Append Blob para esa situación. El siguiente tipo serían blobs de página. Los blobs de página almacenan archivos de acceso aleatorio de hasta 8 kb de tamaño, y estos generalmente se utilizan como archivos de disco duro virtual para nuestras máquinas virtuales en Azure. A continuación, veamos como tu Almacenamiento de Mesa. 3. Comprensión de almacenamiento de la tabla y de la cola: Ahora como su almacenamiento de mesa es un servicio que almacena y datos no relacionales o no estructurados, también conocido como SQL. Y es un servicio Cloud una vez más, que nos da almacenamiento de atributos clave en un diseño sin esquemas. Ahora habrías visto referenciado como tu almacenamiento de mesa cuando estamos viendo otros Cosmos DB. Y es una de las APIs que soporta Azure Cosmos DB. Entonces, si empiezas con mesas de almacenamiento Azure o Table Storage más bien, y luego necesitas migrar para obtener más almacenamiento y más redundancia, entonces puedes pasar a Cosmos DB. Pero este es un excelente lugar para comenzar. Si no estás seguro de tus necesidades de datos y necesitas poder adaptarte a los nuevos requerimientos con respecto a los detalles, entonces esta es una excelente solución para comenzar porque es sin esquemas, por lo que siempre podrá evolucionar con tus necesidades. Ahora el acceso es rápido y rentable y generalmente es más bajo que otras ofertas SQL para volúmenes similares de datos. También puedes considerar que si quisieras comenzar con nuestra instancia relacional o Azure SQL, y sabes que no vas a estar almacenando tantos datos adelantado que podrías comenzar con tablas y luego subir. Pero claro, todas esas cosas afectarán tus decisiones sin embargo. El siguiente tipo de almacenamiento que tenemos es como Almacenamiento en cola. Ahora bien, este es un servicio para almacenar gran cantidad de mensajes. Se puede acceder a estos mensajes en cualquier lugar a través llamadas autenticadas vía HTTP o HTTPS. Esencialmente, cuando configuras tu almacenamiento de cola, vas a obtener un enlace que te permite suscribirte al almacenamiento y leer y escribir mensajes fuera de la cola. El mensaje de cola puede tener un tamaño de hasta 64 kb. Y puedes tener tantos mensajes como sea posible en función del límite de capacidad de tu almacenamiento o conos. Conoce en general como tus señales, almacenamiento o colas en general, se utilizan para crear un backlog de elementos de trabajo. El proceso asincrónicamente. Esto significa que, digamos que si estás construyendo una aplicación que necesita enviar un correo electrónico, quieres que la aplicación detenga mientras te conectas al servidor de correo electrónico, averiguar el contenido del despacho de correo electrónico, el correo electrónico, esperar a ver si fue exitoso, el enviado, y luego el usuario puede continuar, tal vez no. Entonces IQ te permitiría tomar esa información entregada y luego seguir adelante con tu aplicación. Y entonces tendrías otro servicio que probablemente va a sacar ese mensaje de la cola y enviar el correo electrónico eventualmente para que nosotros, la experiencia del usuario no se vea afectada. Y ese es sólo un ejemplo. Las colas se pueden usar de varias maneras, especialmente si estás hablando de microservicios. Pero vamos a pasar por algunos ejemplos con estas cosas. Entonces te veré en la siguiente lección donde comencemos. 4. Crear una cuenta de almacenamiento de Azure: Ahora desde nuestro portal vamos a crear una nueva cuenta de almacenamiento. Así que saltemos a la derecha en él. Vamos a ir a nuestras pastillas y elegir Crear un recurso. Y a partir de aquí vamos a buscar almacenamiento. Entonces solo puedo escribir en almacenamiento, presionar Enter y bien, bueno, solo usemos la cuenta de almacenamiento de autocompletar. Queremos un almacenamiento de conos, así que seleccionemos eso y creemos desde aquí, llenemos o formemos como de costumbre. Entonces como este almacenamiento es un servicio gestionado por Microsoft que incluye datos de Blob Storage Lake Gen2, azure Files. Realmente no hablamos de Azure Files, pero voy a explicar eso un poco. Colas y mesas. No, es importante que consigas bien estos ajustes porque algunas cosas estarán disponibles según tu nivel y según el tipo de cuenta de almacenamiento que aprovistas. Entonces, lo primero como de costumbre es seleccionar el grupo de recursos del carrito. Entonces sigamos adelante y hagamos eso. Y luego para el nombre de almacenamiento, voy a decir como eres caballo, por supuesto voy a elegir la mejor zona en función de mis necesidades de soluciones. Y luego llegamos a elegir una actuación. Entonces, queremos estándar que es el recomendado, o queremos premium, que son cuatro escenarios que necesitan una o queremos premium, latencia muy baja. Entonces para esta demo, mantendremos el estándar. Por supuesto, si tienes otras necesidades, eliges la que más te convenga. También por la redundancia. Sólo voy a elegir localmente redundante. Y redundancia, algo que también debes considerar siempre con cada servicio una vez más, en base a tus necesidades. Así que elegiré almacenamiento localmente redundante. Pasar a la siguiente opción. Dejaré todo lo que estaba marcado, lo dejaré marcado. Y luego aquí si estuviéramos haciendo algunas operaciones de big data que podríamos elegir un Data Lake Gen2 para nombres jerárquico es que no estamos haciendo ninguna operación de big data, así que voy a dejar eso solo. Y luego cuando nos desplazamos hacia abajo, podemos ver aquí ¿ queremos el caliente o el frío? Así que recuerda las teclas de acceso rápido para escenarios de uso diario a los que se accede con frecuencia. Tal vez como CDN. Quizá ahí es donde toda la organización está almacenando archivos y leyendo y escribiendo. Versus el almacenamiento genial, que es probablemente donde pondrías archivos a los que se accede de vez en cuando. Bien. Entonces tenemos archivos Azure. Entonces como sus archivos es una provisión de la cuenta de almacenamiento que nos da un recurso compartido de archivos completamente administrado en la Nube. Y son accesibles a través de estándares de la industria, protocolos Server Message Block o SMB, sistemas de archivos de red o protocolos NFS, o incluso solo una API RESTful. En inglés más sencillo. Como sus archivos serían como un recurso compartido de archivos en la nube que podría configurar para que su organización reemplace el cizallamiento local. Entonces, debido a que no estamos facilitando los recursos compartidos de archivos, no permitiré ni habilitaré los recursos compartidos de archivos grandes. Y entonces podemos pasar al networking y todo lo que hay ahí que hay, la falla está bien. Protección de datos. Entonces aquí podemos configurar opciones de cómo tratamos los datos. Voy a dejar los valores predeterminados marcados, pero te animo a que leas cada uno solo para ver lo que está diciendo y cambiar esos valores en función de las necesidades de orina. Por supuesto. También podemos habilitar el seguimiento de versiones para nuestros blobs. Si tienes varios archivos, son varias versiones de un archivo, éste mantendrá ese registro. Y puedes habilitar un feed de cambio por si acaso tienes algún servicio que necesite suscribirse al estado blob, bien, bueno, este cambio, necesito desencadenar una acción. Entonces esas son cosas que puedes considerar si quieres automatizar algunos otros flujos de trabajo basados en los blobs y actividades realizadas contra tus blobs. Ahora bien, cuando pasamos al cifrado, sí mencioné antes que los datos se cifran en reposo y en tránsito. Entonces solo te están mostrando el tipo de encriptación. Dejaré ahí los valores predeterminados y luego podremos elegir qué servicios apoyan las claves administradas por el cliente, y las dejaré como predeterminadas. Entonces, una vez más, lo siguiente serían nuestras etiquetas. ¿Qué? Yo sólo saltaré a revisar. Y una vez que esa revisión se haya completado con éxito, podemos seguir adelante y crear nuestra cuenta de almacenamiento. Una vez que se complete el despliegue, podemos hacer clic en Ir al recurso. Y una vez que estemos ahí, veremos que se crea nuestra cuenta de almacenamiento o almacenamiento de blob . Y a partir de aquí podemos hacer varias cosas. Entonces, cuando volvamos, exploraremos cuáles son las diferentes opciones y hold puede interactuar con los diferentes componentes de nuestra cuenta de almacenamiento. 5. Emulador de almacenamiento de Azure: Ahora vale la pena mencionar que tenemos acceso a un emulador local para almacenamiento de Azure, y se llama azurita. Y esto es de código abierto y multiplataforma. Entonces tienes varias opciones de instalación y verás aquí que brinda soporte multiplataforma en Windows, Linux y macOS. Y nos permite el acceso local gratuito a un entorno para probar Blob Storage, Queue storage y almacenamiento en mesa. Entonces, todas las actividades que estamos a punto de hacer involucrando todos estos servicios que realmente podríamos hacer si implementamos nuestra provisión, este emulador local para esos servicios. Ahora configurar los servicios es relativamente fácil. Si estás usando Visual Studio 2022, Entonces lo obtienes automáticamente. Si estás usando Visual Studio Code, puedes obtenerlo para extensiones. Si estás usando npm, puedes ejecutar un comando si estás usando más oscuro de lo que puedes tirar de esa imagen e instalar. Y siempre puedes ir directamente al repo azurite Git, repo y clonarlo hacia abajo. Y para ejecutarlo, tienes varias formas interactuar con azurita si estás usando Visual Studio, Visual Studio Code, etc. así puedes seguir adelante y leer esta documentación si solo quieres configurar un entorno local. Y luego puedes seguir adelante y acceder a ellos. Sepa, vamos a explorar el Explorador de almacenamiento un poco más de detalle a medida que avanza este módulo. Pero solo quería señalar eso con el fin de acceder al entorno local y simular interacciones con cada uno de los diferentes componentes de una cuenta de almacenamiento. 6. Administración de cuentas: Entonces desde este dashboard se puede ver que varias opciones que quizás no hayamos habilitado o habilitado y probablemente quisiéramos deshabilitadas más adelante están disponibles para cambiar aquí. Entonces, si quisiera cambiar el nivel de acceso predeterminado de caliente a genial, fácilmente podría hacer clic en él y luego seguir adelante y cambiar eso. Ciertas cosas no se pueden cambiar o simplemente puedes saltar y cambiar el rendimiento de estándar o premium. Pero podrías cambiar algunas otras opciones. Entonces eso es más tarde que decidió o la organización decidió que necesitaba permitir archivos de gran tamaño. Y verás aquí que soporta almacenamiento rápido de hasta 100 kb. Podrías seguir adelante y hacer eso. También podría cambiar estas cotizaciones de acciones aquí, pero por ahora la dejaremos caliente. Posteriormente, ya sea podemos eliminar el recurso, nuestro bajarlo a un nivel genial. Ahora de vuelta en nuestro panel de visión general, vemos que tenemos la opción de abrir en un explorador. Si hacemos clic en Open Explorer, verás que es algo que puedes descargar que te permitirá administrar tus archivos y tus contenedores y todo desde tu computadora. También podemos usar un navegador de almacenamiento. Por lo que podemos hacer clic en el navegador de almacenamiento y eso nos llevará a interfaz lo suficientemente similar que nos muestra el número de contenedores, recursos compartidos de archivos, tablas y colas en el sistema. También podemos seguir adelante e interrumpir con esos componentes. Para que pueda seguir adelante y crear un nuevo contenedor aquí. Y voy a llamar a este contenedor. Es por supuesto contenedor. Puedo establecer el nivel de acceso si quiero que sea privado así que nadie más debería llegar a él o blob para acceso de lectura solo para blobs o contenedor con acceso anónimo de lectura y escritura para continuo y blobs. Ahora deja esto como privado. Y en avanzado, puedo establecer el alcance de cifrado y el soporte de inmutabilidad. Solo voy a seguir adelante y hacer clic en Crear. Ahora una vez que se ha creado ese blob o ese contenedor otro, puedo ir al contenedor y luego puedo agregar un directorio o puedo subir un archivo. Ahora recuerda que el contenedor es donde realmente van los archivos e intenta darte esa vista jerárquica de archivos y citar entre comillas carpetas o directorios ver si es necesario. Entonces puedo agregar un directorio y lo llamo nuevo directorio. Tú, ¿es árbol grueso? Ahí vamos. Entonces dentro de este directorio improvisado, hecho puedo sumar todos los directorios si quiero o simplemente puedo subir. Así que al subir puedo elegir anular si como ya existen, puedo arrastrar y soltar o buscar archivos. Y luego cuando miro avanzado, puedo elegir el tipo de blob que estoy subiendo. Entonces hay un blob de bloque, Blob de página o Append Blob. Generalmente no cambio esto porque realmente solo subo blobs de bloque. O puedes elegir el tamaño de bloque si deseas acceder a los estereotipos. Entonces si hace calor, cool o archivo, y podemos subir una carpeta, podemos hacer varias cosas. Entonces solo voy a hacer una simple subida. Y solo estoy subiendo un PDF aleatorio que encontré en mi computadora. Nada demasiado elegante. Y ahí lo tenemos. Acabo de subir mi primer archivo Blob y es acceso caliente. Por supuesto, puedo seguir adelante y editarlo. Puedo obtener una URL, puedo generar un token SAS. Y vamos a ver todos esos y lo que significan. E incluso puedo borrar. Ahora recuerda que eso habilitó la eliminación suave. Si elimino esto, en realidad puedo volver atrás y mostrar blobs activos y eliminados y eso traerá de vuelta cualquier cosa que haya eliminado. Me va a mostrar y me estaba mostrando la cantidad de tiempo por la que se está reteniendo. Y entonces ¿adivina qué? En realidad puedo ON eliminarlo. Si hago clic con el botón derecho, puedo dar clic en Eliminar y se restaurará. Así que eso es un poco agradable a prueba de fallas para si accidentalmente eliminamos algún archivo. No, recuerde que las acciones rápidas requerirán un poco más terminadas en la configuración, pero es una excelente manera de mover su File Share desde su computadora local o su fascia de organizaciones desde los servidores locales y ponerlos en la Nube. Y esto es especialmente útil para los países que requieren acceso distribuido al mismo conjunto de archivos. Bien, así que si quieres un archivo compartido privado para nuestra configuración distribuida con redundancias implementadas, esta es una excelente opción para ti. Pasemos a las señales. Aunque. Fui a agregar una nueva cola, y voy a llamar a esto es un caballo. P. Sigamos adelante y hagamos clic en Bien. Después verás el cuerpo de la URL. Entonces vamos a movernos, cuando estemos haciendo desarrollo, vamos a movernos a mirar la URL de nuestro contenedor Blob y las blobs y todo. Pero en este momento solo estamos haciendo una visión general de la cuenta de almacenamiento. Entonces desde esta URL de cola, en realidad puedo suscribirme a este sesgo y puedo poner mensajes en la cola. Puedo leer mensajes fuera de la cola ahora y decimos mensaje es ¿a qué nos referimos exactamente? Cuando selecciono la cola, puedo hacer clic en Agregar mensaje. Entonces si agrego un mensaje y digo que este es un mensaje de prueba aleatorio. Y puedo establecer cantidad de tiempo, debería caducar. Y así a los siete días, si no se procesa este mensaje, entonces retírelo. Por supuesto, una vez más, tus necesidades serán diferentes, por lo que eliges la que sea adecuada para lo que necesites. También se podría ver que el mensaje cada vez que caduca, así que una vez que un mensaje es igual a debajo de Q, nunca lo borre hasta que se procese. ¿Bien? Y entonces dirías codificar, nos gustaría hacer eso. Voy a hacer clic. Bien. Entonces cuando hago clic en Bien, ahora tenemos un mensaje sentado en esta cola. Y una vez más, cuando decimos mensajes, estamos hablando de datos que necesitan ser procesados. Entonces este mensaje, como pueden ver, realidad es solo texto. Y yo solo agregué accidentalmente el mismo mensaje dos veces. Realmente es solo toma, bien, entonces eso significa que esto podría ser una oración. Podría ser algún acaparamiento. Incluso podría ser un objeto JSON, que es una forma muy popular de transportar datos como cuerpos de datos a señales. Entonces lo que podría pasar aquí es que podrías enviar sobre un bloque de JSON, objeto JSON como sticks. Y entonces puedes usar un servicio de terceros u otro servicio para procesar realmente este mensaje JSON, que tendrá a mano toda la información necesaria para una operación. Varias cosas y varias formas en las que podrías usar señales. Una vez más, el uso principal para las colas es descargar procesos que podrían causar retrasos en el tiempo de ejecución real de las aplicaciones. Entonces es más rápido volver a usar el ejemplo de correo electrónico, es más rápido entregar ese cuerpo de correos electrónicos, que podría haber sido este objeto JSON con las direcciones de correo electrónico del remitente al receptor y luego el cuerpo del mensaje y todo lo demás lo tenía fuera a la cola y luego continuar con la aplicación. Y luego en el fondo, eventualmente este mensaje será recogido de la cola y enviado. Cuando digo ventralmente, quiero decir, podría suceder. Ve a esta misma hora podría pasar 20 correos después si tienes cientos de usuarios enviando correos electrónicos en el sistema, no quieres cientos de usuarios y el que está esperando el sistema. Hay varias maneras de lo que vamos a ver algunos ejemplos en el resto de este curso. Entonces eso es todo lo que agregamos mensajes a la cola. Y claro que podemos despejar la cola y también podemos dq mensaje. Entonces podría hacer click en este mensaje y puedo decir dq. Ahora bien, la siguiente serían las mesas. Almacenamiento de Mesa, una vez más es un diseño sin esquemas. Para que pueda hacer clic en Agregar tabla, darle un nombre. Y donde quiera que me veas no usando guiones, porque ciertos servicios tienen convenciones de nomenclatura más estrictas y otros, así que algunos de ellos permitirán los guiones, algunos de ellos no lo harán. Entonces lo averiguarás a medida que avanzas. Siempre te avisará cuando estés violando la convención de nomenclatura. Pero cuando hago clic en Bien, eso crea una nueva tabla. Y luego una vez más obtenemos una URL para esta tabla donde podemos suscribirnos para poner datos y leer de la tabla. Y luego si hago clic en el propio recurso, tenemos un layout muy similar a lo que vimos cuando estamos usando Azure Cosmos DB. Tenemos claves de partición, tenemos claves de fila, y tendrá una marca de tiempo. Así que básicamente cuando hago clic en Agregar entidad, tengo la opción de dar una clave de partición y una clave de fila, y puedo agregar otras propiedades en consecuencia. Bien, así que sigamos adelante y agreguemos una nueva entidad. Ahora digamos que quería guardar algunos artículos de abarrotes. Y lo que voy a hacer aquí es que fui a ver que la clave de partición es la categoría del producto. Entonces, si estoy almacenando algo que es lácteo, y luego el, digamos que la propiedad número uno es el precio. Y luego puedo elegir el tipo de datos. Entonces el precio sería el doble. Digamos que cuesta $2.50. Y entonces el siguiente sería el nombre del ítem. No sé por qué puse a la prensa antes que el nombre, pero digamos que esto es leche. Y luego insertar. Ahora, podría haber generado una nueva clave de fila. Podría haber puesto un arco habría usado un GUID. Lo dejé intencionalmente en blanco, pero solo te estoy mostrando los puntos en los que podemos ingresar nuestra clave de partición y clave de fila, pero luego podemos ingresar tantas otras columnas y pares de valor de columna son pares de atributos clave de par de valores clave como necesitemos y como dijimos, medida que crecen tus necesidades. Así que de nuevo, los datos para poder agregar otra entidad que quizá más adelante me di cuenta de que necesito almacenar más propiedades que solo precio y nombre, ¿verdad? Entonces si esta vez fue decir grapa, y luego vamos a darle una clave de fila esta vez una. Y entonces el precio es de diez. Digamos que el nombre es pan. ¿Y qué más necesitaríamos para almacenarlo? A lo mejor quiero que en realidad se ponga en una categoría. Una vez más, eso es un elemento básico. Tal vez fecha de caducidad. Yo solo estoy inventando bien las cosas. Porque una vez más, tus necesidades serán diferentes. La fecha de vencimiento tiene la hora, ¿verdad? Entonces eliges el valor de datos apropiado y luego pongo una fecha de caducidad y solo eliminaré el último. Entonces digamos que este era un nuevo look. A medida que aumenten nuestras necesidades, el número de columnas que podemos poner aumentará, r puede aumentar con muy poca consecuencia. Y de ahí es de donde viene ese aspecto de ninguna secuela. Entonces todavía se ve relacional, pero aún tenemos esa ventaja de que el diseño de listas de esquemas. Ahora que completa nuestro recorrido por nuestra cuenta de almacenamiento. Cuando regresemos, veremos cómo podemos crear soluciones que interactúen con estos diferentes componentes. 7. Explorador de almacenamiento: Ahora bien, si optas por usar el Explorador de almacenamiento, vas a obtener ese código de Visual Studio recorta las imágenes, lo siento, como tu tipo de sensación de Data Studio. Entonces, antes que nada, es posible que desee administrar nuestros conos y autenticarse en consecuencia. Y una vez que esté autenticado, puede perforar en su almacenamiento o conos. Entonces, una vez que hayas resuelto tu autenticación, podrás seguir adelante y acceder a las diferentes partes. Entonces aquí está esa cuenta de almacenamiento que creamos antes. Y una vez más, podemos desglosar en él y podemos ver diferentes recursos compartidos de archivos, las señales, las tablas, todos esos recursos que habíamos visto antes. Es posible que incluso veas algunos otros que no viste en el navegador Explorer. Para que puedas seguir adelante y hacer eso. Y todas las opciones que tenías en el navegador también están disponibles aquí. Así que realmente puedes administrar tus archivos, tus blobs, tus carpetas, todo aquí mismo. Y esto es aún mejor para la administración de máquina a máquina del Blob Storage. Entonces creo que conseguir el Explorador de Almacenamiento es una muy buena idea. Y hace que la gestión de tu almacenamiento de conos sea mucho más fácil que tener que ir al navegador cada vez. 8. Resumen de la aplicación web: Ahora vamos a desarrollar una aplicación web que es cuando usas los diferentes componentes que nos dan el almacenamiento o conos. Así que nuestra idea de proyecto web ha sido llevar el formulario de inscripción para los asistentes a la conferencia. Vamos a usar asp.net, MVC. Esta vez hemos usado las páginas de Razor, tú has usado blazer, vamos a usar MVC. Pero una vez más, una vez que sea dotnet Core, los conceptos serán transferibles. Conoce lo que vamos a hacer es usar Azure Table Storage para almacenar el registro y dar clic en Enviar. Vamos a almacenar esos datos en esta mesa de almacenamiento. Vamos a permitirles subir una imagen. Esa imagen sube, usaremos el Azure Blob Storage. Bien, así que normalmente lo almacenarías localmente, pero no queremos que se almacene localmente en el servidor. Vamos a descargar eso como tu almacenamiento de Blob. Vamos a usar el almacenamiento Azure Queue porque queremos enviar un correo electrónico. Entonces usé ese ejemplo antes en este segmento del curso. Estamos enviando un correo electrónico es algo que requiere el up para congelar, hacerlo, y luego seguir adelante. Entonces lo vamos a hacer es simplemente entregarlo a la cola. Y luego vamos a crear una app de consola que va a simular un cliente que lea la cola y luego procese el mensaje o los datos de correo electrónico de la cola para su despacho. Así que vamos a hacer todas esas cosas que vienen. 9. Crear y configurar . Proyecto básico de red: Entonces, usando la misma solución que hemos estado usando para todo este curso, quería crear un nuevo proyecto. Por supuesto, esto es opcional. Si quieres separar cada uno en su propia solución, entonces puedes seguir adelante. Y una vez más, estoy usando Visual Studio. También puedes seguir adelante si estás usando Visual Studio Code. Así que adelante y crea un nuevo proyecto. Y esta vez voy a usar una aplicación web MVC. Así que solo voy a escribir las letras MVC en la búsqueda, y luego elegir ASP Core Web arriba con Model View Controller. A continuación, voy a llamar a este MVC Storage Account Demo. A continuación, todo puede permanecer como predeterminado. Y luego creamos, si estás usando la terminología para Visual Studio en Linux o Mac OS, puedes seguir adelante y navegar hasta tu directorio deseado. Y entonces se puede decir dotnet, nuevo MVC. Y luego puedes sacarlo a un directorio con el nombre del proyecto. Y luego puedes seguir adelante y darle a Enter. Entonces, ahora que se ha creado el proyecto, sigamos adelante y agreguemos algunas de las bibliotecas con las que necesitaremos trabajar. Y claro que conocemos por conocer las diferentes formas en las que podemos agregar bibliotecas. Pero solo voy a usar los terminales ya que el terminal va a funcionar para todos, ya sea que estés en el código de Visual Studio o Visual Studio. Entonces voy a decir dotnet agregar paquetes o agregar paquete más bien. Y luego el primer paquete que estamos agregando es Azure Storage Blobs. Así que sólo podemos darle a Enter. Bien, y luego una vez que eso se inserte con éxito, solo voy a borrar la pantalla. Y luego esta vez estamos agregando colas de almacenamiento de punto cero. Y luego finalmente, vamos a agregar un punto cero tablas de puntos de datos. Bien, entonces dotnet agrega paquete como tus tablas de puntos de datos. Ahora que tenemos todas esas configuraciones, adelante y agreguemos nuestra cadena de conexión de almacenamiento, almacenamiento o cadena de conexión de dos puntos. Yo solo voy a saltar a la configuración de la app que Jason, déjame esconderla, la terminal para que podamos conseguir un poco más de bienes raíces. Y sólo voy a llamar a esta cadena de conexión de almacenamiento. Y entonces el valor para nuestra cadena de conexión de almacenamiento va a venir de nuestro portal. Así que saltemos a nuestro portal. Y luego saltamos a las llaves de acceso sangrando. Y luego vamos a seleccionar la cadena de conexión. Así que solo voy a mostrar Copiar al Portapapeles, saltar de nuevo a nuestro código, y luego podemos pegarlo. En. Ahí vamos. Así que mi portapapeles todavía no era primo. Entonces esa es nuestra cadena de conexión. Y voy a crear una nueva carpeta. Y esta nueva carpeta va a almacenar nuestro modelo de datos para las mesas de almacenamiento. Entonces solo lo llamaré datos. De acuerdo con nuestra convención de nomenclatura ya establecida, vamos a agregar una nueva clase. Y sólo voy a llamar a este asistente. Sepa, porque vamos a estar usando Table Storage, necesitamos seguir adelante e implementar la interfaz de la entidad de TI. Así que los asistentes van a heredar del bate de la entidad de mesa i. Y esto nos viene de nuestra clase de tablas de datos. Y luego mediante el uso de Puntos de control, puedo implementar la interfaz. Entonces esto ahora nos da estas columnas específicas, ¿verdad? Recuerda que estas columnas estaban ahí antes de que empezáramos a agregar otros atributos. Bien, así que claro que solo puedo limpiar esto y dejar que obtengan B me den y el set, set. Y eliminar todos estos a través de nuevas excepciones implementadas de tuercas de tiro. Bien, entonces después de que hayamos limpiado eso, sigamos adelante y agreguemos nuestras propias propiedades. Entonces esto me está ayudando aquí afuera. Así que tengo nombre y probablemente querría FirstName separado del apellido. Y pongamos una dirección de correo electrónico. Y ¿qué más necesitarías un rayo en el asistente? Trabajemos con esto por ahora. Entonces como nuestros requisitos, cms significará poner más. Pero comencemos con esto. 10. Agregar servicio de almacenamiento de tablas: Ahora vamos a configurar nuestro Servicio de Almacenamiento de Mesa. Entonces voy a crear una nueva carpeta, y voy a llamar a ésta servicios. Y aquí voy a crear una nueva clase. Y a esta clase se le va a llamar Servicio de Almacenamiento de Mesa. Y mientras estoy aquí, sólo voy a hacer un ajuste rápido aquí. Creo que solo voy a calificar esto un poco y llamarlo entidad asistente. Sólo para que no sea sólo ese diez d. Eso es sólo mis mis pequeños ajustes. Si sientes la necesidad de hacerlo también, entonces hazlo. Sólo lo estoy renombrando aquí y renombrando el archivo para atender a la entidad alma por nuestros métodos aquí, voy a tener, y sólo voy a escribir al público. Lo siento, voy a escribir primero todos los nombres de los métodos y luego rellenamos los espacios en blanco. Entonces fui a tener una tarea que va a regresar entidad asistente. Y esta tarea se va a llamar get attendee. ¿Bien? Y tomará y ID de cadena de identificación porque pretendo usar bienes para el ID. Buenos valores. Entonces vamos a tener buenos asistentes conseguir asistentes, lo que tomará un viejo parámetro. Y entonces esto devolverá una lista de entidades asistentes. Y luego dos métodos más, uno para upsert y otro para eliminar. Entonces entre estos métodos tenemos funcionalidad completa de crud. Sólo voy a extraer esto en una interfaz para que tengamos esa abstracción y esa herencia. Ahí vamos. Ahora, podemos comenzar a cablear esto. Entonces voy a crear un constructor CT OR y Tab dos veces, degenerar ese constructor. Y voy a inyectar mi objeto de configuración de icono en este servicio para que podamos acceder a ese archivo de configuración y a los valores ahí dentro. Déjame cambiarle el nombre a eso. También voy a tener una cadena privada, digamos const para el nombre de nuestra tabla. Y yo sólo voy a llamar a esto asistentes. Bien, así que eso es lo que vamos a estar llamando a la mesa en nuestro almacenamiento de mesa. Y tenemos la configuración. Ahora necesito un cliente. Bien, así que voy a crear método, voy a hacer que sea un método privado aquí abajo. Tarea tan privada que va a devolver un objeto cliente de tabla. ¿Bien? Y claro, a medida que avanzas, agregas lo que falta usando declaraciones. Vamos a decir consigue cliente de mesa. Y este cliente va a definir en primer lugar un cliente, yo sólo estoy llamando cliente. Este cliente va a ser igual a nueva tabla. Bueno, en realidad este es un cliente de servicio. Disculpe, estoy renombrando esto a cliente de servicio. Entonces este es el nuevo cliente de servicio de mesa. Ahí vamos. Entonces vamos a pasar ese valor de configuración para nuestra cadena de conexión. Y por si acaso no recuerdas la llave, siempre puedes volver a saltar por aquí. No recuerdo lo mucho que saltó por aquí para conseguirlo. Y eso es lo que vamos a usar para el valor de la clave de configuración. Bien, así que ahora que tenemos el cliente de servicio, vamos a salvar a nuestro cliente de mesa va a ser igual a los clientes de servicio. Puntos obtienen mesa, mesa cliente a través del nombre de la tabla. El nombre de la tabla es el mismo valor que acabamos de almacenar arriba aquí. Para que podamos hacer eso. Entonces vamos a esperar o mesa de clientes para crear si no existe. Así que mira este nulo. Si la tabla no existe cuando estamos tratando de comunicarnos con nuestra cuenta de almacenamiento, tenemos la opción de simplemente crear si no existe. Así que sólo puedo elegir eso. Y por supuesto voy a elegir la opción asíncrona y luego podremos devolver el cliente de mesa. Entonces, si la mesa no existe, entonces seguirá adelante y la creará y se conectará a ella. Y entonces nuestro cliente ahora encarna ese objeto de conexión. Entonces, vamos a averiguar todo lo que estamos haciendo esto. Conseguir asistente por identificación. Ahora aquí vamos a tener que obtener una instancia de cliente inestable, y luego vamos a seguir adelante y ¿obtengo Entity Sync? Sepa, simplemente se ve así. Y claro si estamos esperando que el metilo y debe ser asíncrono. Así var mesa cliente es igual a dos. Conseguiríamos que el cliente de mesa eligiera el método que acabamos de hacer. Y entonces la segunda línea que notas tiene un error. Entonces es obtener entidad una sincronización y todos esos ponen el ID y tenemos un error. ¿Por qué tenemos un error? Porque requiere una clave de partición. ¿Bien? Entonces tenemos que dar una clave de partición y una clave de fila para poder obtener la entidad. Entonces la entidad asistente no tiene ningún valor de clave de partición aquí, ¿verdad? Quiero decir, sí, tenemos el campo incorporado para una clave de partición, pero no tenemos un campo dedicado que actúe como nuestra clave de partición. Entonces como parte de un buen diseño, en realidad le daríamos otra propiedad. Y veamos que cada asistente a nuestra conferencia sería profesional en cierta industria, por ejemplo. Entonces lo que podemos hacer aquí es decir industria, solo lo llamaremos el nombre de la industria en la que estás, ya sea TI, educación, etcétera. Y entonces la industria aquí puede ser nuestra clave de partición para particionar a todos los asistentes por la industria en ella. Tiene sentido, ¿verdad? Entonces, a medida que construye su aplicación para su propósito, siempre quiere asegurarse de que está tomando las mejores decisiones posibles para su industria del diseño aquí será o claves de partición. Así que volvamos a nuestro método y lo que voy a hacer es que debemos pasar en industria de cadenas y cadena ID. Y luego pasaremos en la industria y la identificación para seguir adelante y buscar a ese asistente. Para el siguiente método, que es conseguir asistentes. Por supuesto, empezamos con el cliente de mesa y luego vamos a hacer un poco diferentes bits de código aquí. Entonces voy a decir tabla de páginas. Tiendo el objeto entidad llamado entidades asistentes va a ser igual a la tabla Cliente punto consulta entidad asistente. Y entonces podemos devolver las entidades asistentes D2 lista, y luego eso va a satisfacer ese tipo de retorno. Ahora veamos nuestro absurdo. Como de costumbre, comenzamos con nuestro objeto cliente de pesca o mesa. Y si esperamos, el método debe ser un fregadero. Y luego sólo vamos a seguir adelante y esperar nuestros puntos de cliente de mesa. Déjame intentarlo de nuevo. Entonces, oh, lo siento. Eso es asíncrono. Espere al cliente de mesa. Ahí vamos. No upsert entidad asincrónica. Sólo vamos a seguir adelante y darle la entidad asistente. Entonces ya vimos obras de hold upsert de cuando estábamos haciendo Azure Cosmos si no estás tan familiarizado con él. Absurdo es básicamente un portmanteau o una combinación de las palabras update e insert. Entonces, si la entidad existe en base a la información proporcionada, especialmente con la clave y la clave de partición, entonces solo reemplazará los detalles. Si no existe, entonces creará el nuevo registro. Bien, así que eso es todo este upsert funciona para o eliminar asistentes. Por supuesto, lo hacemos asíncrono. Seguimos adelante y buscamos a nuestro cliente de mesa. Y sólo vamos a seguir adelante y esperar cliente de mesa Dot Delete a sink. Y lo que no hice por éste es proporcionar parámetros que necesitamos proporcionar para eliminar asincrónico. Entonces para eliminar asíncrono, necesitamos pasar lo que sería la clave de partición y los valores de la clave de fila. Y esos son los valores que pasamos a nuestra operación de eliminación. Ahora bien, si alguna vez tienes dudas sobre lo que debes pasar, siempre puedes mirar a los señores superiores de los métodos y eso te ayudará a darte una pista. Así que adelante y pasa en los parámetros y eso debería ser eliminar entidad un sumidero. Pido disculpas no eliminar asincrónico, sino eliminar entidad asincrónica. Asincrónico podría haber eliminado la tabla. Bien, entonces delete entity tomará esos dos parámetros. Ahora tenemos nuestro servicio para nuestro Almacenamiento de Mesa creado. Aquí hicimos un ligero ajuste a nuestra entidad. Y claro que necesitamos actualizar nuestro contrato, que es la interfaz, porque cambié la firma por este método. Así que simplemente saltaré por ahí y cambiaré el Delete para tomar los dos parámetros como se espera. Y para que consiga asistente, también necesitamos actualizarlo con esto. ¿Bien? Entonces una vez que el contrato es feliz, entonces el servicio es feliz. Y no tenemos ningún conflicto y registro. Y entonces como de costumbre, tenemos que registrar esto. Así que sólo voy a saltar a nuestro program.cs y ver un punto constructor. Déjame intentarlo de nuevo. Servicios Builder dots. Dots add scoped service para el servicio de TI fue almacenado implementado por Table Storage Service. Y eso es todo. Entonces, cuando regresemos, vamos a seguir adelante y crear el controlador y las vistas correspondientes que luego nos permitan facilitar ese proceso de registro. 11. Crear controladores y vistas: Ahora vamos a crear nuestro controlador. Vamos directamente a nuestra carpeta controllers select controller, y solo haremos un controlador MVC con acciones de readwrite. Haz clic en Agregar y déjanos llamarlo el logro. Este controlador de registro de asistentes, por supuesto, necesita ser agregado. Y ahí lo tenemos asistente, su disertación sobre controlador. Inyectemos nuestro servicio de TI. Así que me Almacenamiento de Mesa, I Servicio de Almacenamiento de Mesa. ¿Correcto? Y podemos seguir adelante e inicializar esto como un campo privado de solo lectura. ¿Bien? Y ahora podemos comenzar con nuestras acciones. Ahora, en términos generales, querrás usar modelos de vista para manejar lo que está sucediendo en el frente y diferente del backend. Pero una vez más, esta es una demostración rápida, así que perdona la falta de mejores prácticas y abstracciones solo estábamos haciendo una simple demostración para mostrar la conectividad. Después puedes hacer todo lo posible con todas las mejores prácticas y separaciones de preocupaciones para nuestra vista de índice, lo primero que vamos a querer hacer, por supuesto, es obtener los datos. Por lo que quiero decir var data es igual a subrayado tabla de almacenamiento punto obtener asistentes. Ahora bien, este es un sincrónico que necesito esperar. Y luego por supuesto, convertir este método en un método asíncrono también. Entonces puedo pasar esos datos a la vista. Ahora vamos a generar la vista. Así que haga clic con el botón derecho en la palabra Ver, haga clic en Agregar vista. Y yo sólo voy a ir a la vista de navaja. Y voy a usar una plantilla de lista. Y la clase modal va a ser entidad asistente. Y puedo dejar todo lo demás. No necesito hacer referencia a bibliotecas de scripts y luego hacer clic en Agregar. Y en ningún momento se ha generado nuestra vista de índice. Entonces a partir de aquí, no me molestaré en modificar lo que estamos viendo todavía. Lo que voy a modificar es esta sección donde pasamos por encima de las claves primarias para que podamos usar la clave de fila de rol. Y claro que necesitamos la fiesta chunky, así que déjenme nombrar estos apropiadamente. Entonces necesitamos el id y la clave de partición, que se va a llamar industrias. Puedo decir que la industria es igual a item dot industry coma e id es igual a rho KI. Bien, así que eso es lo que vamos a tener que pasar a nuestra edición, a nuestros detalles, a nuestros métodos de eliminación. ¿Por qué? Porque todos estos necesitan tanto la clave de partición como el valor id, porque necesitamos buscar para poder editar, necesitamos buscar para poder ver los detalles. Y por supuesto la eliminación, también necesitamos esos datos. Entonces así es como vamos a hacer el índice. Ahora pasemos al siguiente, que son los detalles. Y los detalles seguirían a una operación similar. Pero recuerda que aquí estamos tomando el int id y estamos tomando el valor de la industria de cadenas. Y en realidad id es una cadena porque vamos a estar usando una cuadrícula. Y tenemos que hacer algunos ajustes aquí. Entonces esta tiene que ser una tarea asíncrona. Por supuesto, podría haber usado el IntelliSense para convertir esto. Así que permítanme hacer el método Asynchronous a los espíritus que mecanografían. Y entonces no vamos a conseguir asistentes, sino que estamos obteniendo nuestro diez d, que no va a esperar que pasemos el valor de la industria y el valor id. Entonces los pasamos a más devolvemos la vista con los datos. Y entonces podemos generar estos datos, esta vista. Y detallaremos, así usaremos la plantilla de detalle contra la misma entidad y seguiremos adelante y agregaremos eso. Ahora mismo tenemos nuestra vista de detalles creada. Entonces déjame cerrar cualquier cosa que no necesitemos en este momento. Para Create, podemos dejar eso porque no necesitamos ningún dato por adelantado o Louis. Entonces, veamos esto. Si queremos que proporcionen el valor de la industria, teóricamente podríamos darles una lista desplegable que no se basan teóricamente en sus necesidades. Podría darles listas desplegables para que puedan elegir entre una lista seleccionada de industrias que le gustaría tener como claves de partición. Para esta simple demostración, solo seguiremos adelante y la escribiremos. Pero claro, en el futuro, en el futuro, es posible que desee tener una lista curada que reconozca como su parte o posibles valores de clave de partición, ¿verdad? Así que dejemos en paz la vista Crear. Bueno, generemos esta visión. Entonces solo voy a hacer clic derecho Agregar vista, vista de navaja. Y luego usaremos nuestras plantillas de creación contra la misma entidad. Adelante y agrega. Después de que se haya agregado a los creadores, It's Notice no está diciendo asincrónico, no necesitábamos nada asincrónico en el create, pero necesitaremos hacer algunas cosas asincrónicas dentro del método post. Entonces, en el método post, se espera que volvamos a los asistentes. Objeto de entidad. Ahí vamos. Entonces lo que vamos a hacer es intentarlo. Entonces, antes incluso de llegar al interior del try, antes incluso de llamar al servicio, necesitamos poner algunos datos. Entonces aquí quería decir que la clave de partición, clave partición de entidad asistente va a ser igual a y luego esa es la entidad asistente. Puntos. ¿En qué nos pusimos de acuerdo? Creo que fue industria. Eso es correcto. Y luego voy a afirmar que la clave de fila, así que agregamos la clave de fila. Ahí vamos, va a ser igual a puntos de Boyd, nuevo GUID. Para enhebrar. Esos dos, podemos seguir adelante y llamar a nuestro Servicio de Almacenamiento de Mesa punto upsert asistente y darle el objeto de entidad asistente. Porque todos los demás campos se habrían establecido a través del llenado de ese formulario Crear. Tengo un error aquí porque no se completó la conversión a asíncrono. Así que sigamos adelante y nos reunamos. Esa es una tarea y ese error desaparece. Entonces ahora podemos pasar a las ediciones. Por lo que la edición tendrá que hacer una búsqueda similar a los detalles. Así que sólo podemos seguir adelante y hacer eso. Y claro que los parámetros tienen que ser similares. Entonces, ¿por qué escribes cuando puedes copiar y pegar? Y después, oh, necesitamos que esto sea asíncrono, así que vamos a convertir eso. Y luego en la post operación, realidad vamos a hacer algo similar a lo que hicimos en la creación. Así que tenemos que asegurarnos de que restablecemos una clave de partición y una clave de fila. Y luego seguimos adelante y absurdos. Muy bien, entonces verás que crea y edita básicamente sigue el mismo tipo de procedimiento, pero tenemos que ser un poco más cuidadosos con REA. Entonces solo voy a cambiar todo este parámetro y va a pasar por y asegurarse de que todo opere de la manera que esperamos. Entonces, una vez más, estamos configurando la industria. Lo que es la industria es ser la clave de partición. Sin embargo, ¿quiero tener una nueva clave de fila? No me gustaría tener una nueva llave de fila. Entonces voy a quitar esa porque la clave de fila ya viene con esta entidad y siempre podemos hacerla oculta en el formulario, ¿verdad? Entonces quiero volver a establecer la clave de fila, solo estaré restableciendo la clave de partición si acaso ese valor cambió cuando se editó. Ahora, necesito cumplir con esto, por supuesto, es sincrónico. Ahí vamos. Podemos seguir adelante. Ahora para el Delete, voy a renunciar a la necesidad del registro de eliminación. Sólo voy a eliminar la confirmación por lo menos por ahora. Entonces voy a quitar el getMethod y luego implementamos el método post. Ya lo convertí a un método asíncrono, y coloqué en la cadena ID y parámetros industriales muy parecidos a los que teníamos para la edición. Y lo que haremos es, voy a esperar, eliminar al asistente después de que reciba los valores de la industria y el ID. Entonces, lo que haremos en el índice es refactorizar esto de un enlace a un botón de envío de formulario real. Simplemente coloque el foro aquí. Y lo que tenemos es una etiqueta de formulario simple con la acción ASB como delete, por lo que golpeará el método post. Y luego tenemos dos entradas, ambas como ocultas. Y el valor aquí va a empatar. Y déjenme hacer esta corrección. Entonces uno debe ser item dot roll key y el otro es item dot industry, eso es valor. Y luego los nombres por supuesto corresponden con los nombres de parámetros que delineamos en nuestros parámetros axones. Y luego tenemos una entrada que es un botón de enviar, que simplemente parece un botón de peligro. Entonces puedo comentar este enlace porque no lo necesitamos. Entonces así es como vamos a manejar la eliminación. Ahora tengo una cosa más que quiero señalar, y esto es un poco de nuestro refactor y es una especie de crítica que tengo para Visual Studio y la forma en que refracta métodos cuando los hace como fregadero. Pero añadiendo esa palabra clave asíncrona hasta el final, no me gusta que sea monedero. También. Como notarías que todos estos son métodos asincrónicos y no dije obtener asistente asincrónico. Entonces, si quieres mantener esa convención de nomenclatura con tus métodos, está bien. No es algo que necesariamente practique más allá de mis preferencias personales. He notado que MVC no hace un buen trabajo manejando navegación cuando se agrega asincrónico al nombre del axón y la vista. Así que esté en el lado seguro. Mi sugerencia es que si se renombró a asincrónico, simplemente elimine ese nombre asincrónico. Esa es una. Entonces hazlo por todas las acciones. Verás que ya pasé por. Y todos los que fueron edición asincrónica e indexada asincrónica y todo. Se le cambia el nombre a solo el nombre original sin anexar asincrónico. Ese es uno para cambiar el nombre de las vistas, ¿verdad? Entonces, todas estas vistas intentarán ir a la versión asincrónica o se llaman asincrónicas. Así que puedes simplemente seguir adelante y eliminar esa palabra clave asincrónica. Solo estoy haciendo clic en él y presionando F2 en mi teclado para luego renombrarle el nombre. Y la acción dentro de las que son formas que ella, solo debería ir a Editar, ¿verdad? Entonces esto es solo un refactor rápido que estoy sugiriendo solo para asegurarnos que no tenemos ningún problema. Nunca me he sentado realmente y dije: Déjame intentar hacer la convención de nomenclatura asíncrona sobre el trabajo. Simplemente lo prefiero sin, así que es algo que traté de evitar. Derecha. Y se generan éste antes. Si quisieras tener la página de confirmación, podríamos haber mantenido el get generado la vista en consecuencia. Entonces esta es la forma real que acabo de usar en el índice para asegurarme de que solo podamos seguir adelante y eliminar al post. La actividad final es repasar a nuestro diseño y dejarnos cambiar nuestro menú para tener la opción de ir al controlador de registro de asistentes, y va a ir a la vista de índice, luego darle un nombre. Entonces solo elimino el enlace de privacidad y lo reemplacé por el enlace de registro de asistentes. Así que cuando volvamos, podemos seguir adelante y probar. 12. CRUD de almacenamiento de la mesa: Bien, entonces estoy ejecutando la aplicación y por si acaso te estás preguntando cómo ejecutarla. Una vez más, asegúrate de que el nuevo proyecto sea tu proyecto de inicio. Y entonces puedes simplemente ejecutar sin depurar si quieres depurarlo. Y por todos los medios, adelante. Entonces me estoy ejecutando sin depurar y solo voy a seguir adelante y golpear registro de asistentes. Entonces vemos que nuestra página de índice cargó, no nos dieron errores. Entonces eso significa que está conectado a nuestro almacenamiento o conos. La mesa vio que nada volvió y nos está mostrando en blanco. Eso está bien. Vamos a crear nuevos. Si creo un nuevo registro de prueba, digamos que prueba, prueba y prueba en ti.com e industrias TI, y por supuesto no proporcionaré una clave de partición, clave de fila y marcas de tiempo para que las piezas de repuesto de la limpieza que necesitarían realizar en nuestra interfaz de usuario. Pero eso está bien. Vamos a golpear a Crear. Y aquí vemos que volvió con el disco. Entonces la industria y yo estamos particionando clave de los mismos valores y obtuvimos un nuevo bien para o 0 clave y un valor de marca de tiempo. Si voy a los detalles, vemos todo al respecto. Entonces sabemos que la clave de partición fetch one by ID slash está funcionando. Si voy a Editar, intentemos cambiar algo aquí. Entonces esta es la prueba 123, y voy a guardar, y eso ha editado ese archivo. Bien. Ahora tomemos nota o algo así. Si vuelvo a Editar, esta vez cambié la industria a ITU uno-dos-tres o intentemos algo de educación real, ¿verdad? Entonces no lo fue, la TI era educación. Y luego traté de guardar nodos que obtuve un registro completamente nuevo. Es la misma clave de regla, pero en diferente clave de partición. Entonces hay que tener mucho cuidado con eso. Porque sí especificamos que el almacenamiento de la mesa está usando una clave compuesta. Está mirando tanto la clave de partición como la clave de fila. Entonces aparte, Deshawn podría tener varios registros con lo mismo lo siento, podemos tener varias particiones con los registros con el mismo valor de clave rural. Y eso es lo que estamos viendo aquí. Esta es una partición diferente y estamos obteniendo por el valor de la clave de fila aquí, ¿verdad? Entonces simplemente siguió adelante y creó un récord completamente nuevo. Entonces eso es algo con lo que debes tener mucho cuidado al administrar ese valor de clave de partición. Y por esa razón, probablemente podrías usar la clave de fila como ambas partes, Sean Andrew key, para asegurarte que es el mismo registro todo el tiempo. Ahora, voy a seguir adelante y borrar, y no me estoy molestando en arreglar la estética y nada. Esto es realmente solo para tener una demostración con la integración en la nube, no necesariamente para cumplir con los elegantes, ¿verdad? Entonces solo voy a seguir adelante y probar la eliminación y eliminar uno de estos registros. Y ahí vamos. El borrado funcionó. Así que ahí mismo acabamos de validar que nuestra multitud de Almacenamiento de Mesa funciona. Sepa lo que puede hacer para una mayor consideración ahora es seguir adelante y limpiar cosas como crear y editar formularios para que no necesite que se muestre la clave de fila de marca de tiempo y la clave de partición. Podemos eliminarlos de Create, y podemos eliminarlos de nuestra marca de tiempo. Así que sigamos adelante y limpiemos eso. Entonces para nuestro listado de índices, probablemente tampoco necesitemos ver esas cosas. Entonces no necesito ver la clave de partición, fila, clave , probablemente fila Keegan, quédate. Pero entonces como es más una idea, probablemente me gustaría moverla al frente. Y aun así, ¿de verdad quieres ver esa grilla? ¿Ahora? Vamos a quitar eso también. Por lo que ninguno de esos tres elementos existe aquí también. Así que solo lo mantenemos agradable y limpio. Y ahí mismo acabamos implementar crédito para Almacenamiento de Mesa. Ahora veamos que nuestros requisitos han cambiado. Y no, necesitamos agregar alguna forma de carga de archivos a este formulario porque los asistentes necesitan subir un avatar o alguna imagen que necesitaríamos almacenar de forma segura y luego recuperar para su visualización. Entonces ahora vamos a ver cómo podemos aprovechar Blob storage.com o algo así. 13. Agregar servicio de carga de Blob: Bien, entonces nuestros requisitos han cambiado. Sé que necesitamos almacenar una imagen subida para el usuario, pero no queremos almacenarla en nuestros servidores por varias razones. Entonces lo que vamos a hacer es descargar esa responsabilidad a un Azure Blob Storage. Entonces voy a agregar un nuevo campo a esta entidad de tabla y voy a llamarle nombres de imagen. Entonces lo que vamos a hacer es cambiarle el nombre para que tenga el mismo valor que tendría la clave de fila. Y simplemente guardará ese nombre de imagen aquí. Y entonces eso servirá como punto de referencia futuro siempre que necesitemos hacer referencia al blob. Ahora vamos a crear un nuevo servicio, y ya lo he hecho. Vamos a llamarlo Servicio de Almacenamiento de Blob. Así que simplemente haga clic con el botón derecho en los servicios, agregue una nueva clase y estamos llamando a un Servicio de Almacenamiento de Blob. Y en mi Servicio de Almacenamiento de Blob, tengo tipo de notas escritas, algunas del código ya alguien por quien guiarte para que no tengas que mirarme escribir. Ahora, lo que he hecho es en primer lugar, crear un constructor donde inyecté la configuración. Para que puedas seguir adelante y hacer eso. También tengo un campo llamado nombre de contenedor, que estoy llamando imágenes de asistentes. Ahora bien, la razón por la que estoy usando todas las minúsculas es esa y antes aludí a las convenciones de nomenclatura. Con Blob of storage, no puedes usar caracteres mayúsculas en tu rodilla. Entonces, cualquier cosa que estés nombrando, tienes que ponerle nombre en minúscula, podrías usar algunos caracteres especiales. Nota al pie, solo estoy guardando todo en minúsculas las imágenes de los asistentes. Y entonces tengo mi metilo y eso va a crear un contenedor clientes. Ahora puedes envolverlo en ese camión todavía para que puedas coger cualquier excepción es especialmente con respecto al naming porque lo que estamos haciendo aquí es que estamos viendo intentar crear un contenedor, un cliente de contenedor Blob para que sea específico y pasar esa cadena de conexión desde configuración y ese nombre de contenedor. Ahora bien, si tu nombre no coincide, entonces definitivamente terminarás con una excepción. Entonces solo puedes hacer eso prueba catch y poner un punto de interrupción aquí solo para que veas cuál es la excepción, probablemente obtendrías un error 400 en ese momento. No, vamos a seguir adelante y ver un peso creativo NO existe. Entonces, cuando intenta hacer esto, golpearía la excepción. Y entonces si llega hasta aquí, queremos devolver el contenedor. Entonces ese es nuestro primer método en nuestro nuevo servicio. Ahora lo siguiente que queremos hacer es subir un blob. Entonces vamos a tener un método llamado upload blob. Va a ser una tarea asincrónica que devuelve una cadena y está tomando el archivo iPhone como tipo de parámetro. Entonces cuando subimos usando MVC o dotnet Core, en general, formé archivo es el tipo de datos que recibe ese archivo subido. Y luego vamos a pasar en un nombre de imagen. Lo primero que estoy haciendo es establecer cuál será el nombre de Blob. Y el nombre de la imagen aquí representa el nombre que quiero para almacenar un archivo como la razón. Es una buena idea cambiar el nombre tu archivo antes de subirlo es que si tienes varios usuarios que están intentando subir archivos con los mismos nombres, vas a terminar con colisión. Entonces es mejor cambiarle el nombre a algo que sea único en el disco. Entonces podemos seguir adelante y establecer esos nombres de blob. Entonces estoy tomando el valor del nombre de la imagen, puedo ir a pasar por encima de un valor único. Y luego estoy agregando ese nombre a la ruta original del archivo que se cargó. Entonces path that gets Extension Form file dot Nombre de archivo mirará el nombre completo del archivo, obtendrá el punto, JPEG, PNG, sea lo que sea, y luego lo agregamos a nuestro nombre único. Llegamos a nuestro país y a nuestro cliente. Entonces voy a establecer un objeto de flujo de memoria donde voy a copiar del archivo de formulario al flujo de memoria, restablecer la posición a cero, y luego vamos a usar el cliente, subir el blob con el nombre Blob del flujo de memoria. ¿Bien? Y ese valor por defecto representa token de cancelación. De hecho podrías prescindir de él. Entonces como no estamos usando tokens de cancelación que eliminas eso. Y luego voy a devolver el nombre de Blob. Ahora el cliente en sí es en realidad cliente aquí en realidad va a ser un tipo de blob de respuesta, información de contenido. Entonces, a partir de ese objeto, en realidad podrías mirar el valor y ver diferentes bits de información sobre un blob que acababa de subir. Si necesitas más información que solo el nombre de Blob, no dudes en usarlo. También podríamos usar el cliente de contenedores para obtener más información después también. Pero por ahora solo quería guardar el nombre del archivo. Ahora que hemos subido o archivo, veamos cómo recuperaríamos o blob. Ahora recuperar el blob va a ser una situación especial porque lo que sucede es que cuando configuramos el contenedor Blob, va a ser por defecto privado. Y ya hemos establecido que usamos URLs para acceder a los diferentes blobs una vez que estén subidos, vamos a ver más adelante las URL. Pero el caso es que si es privado, entonces no puedes simplemente acceder a él. Y no quieres simplemente hacerlo público porque quizás no quieras encontrar a nadie para poder acceder a él. Entonces al recuperar nuestros blobs, necesitamos generar lo que llamamos un SAS tokens son tokens de firma de acceso compartido y vamos a ver eso en este método. Entonces nuestro nuevo método aquí es get blob URL, que va a devolver una cadena. Entonces es una tarea asíncrona que devuelve una cadena. Y una vez más toma el nombre de la imagen. Entonces inicializamos un cliente contenedor, y luego inicializamos un cliente de Blob también en relación con ese nombre de imagen. Ahora tenemos lo que llamamos el blob builder. Y este es el constructor utilizado para generar el token de firma de acceso compartido al que acabo de aludir. Entonces lo que vamos a hacer aquí es blob SAS builder es igual a un nuevo objeto, que va a tomar el nombre del contenedor al que queremos acceder, el nombre Blob al que vamos a querer acceder. Entonces vamos a establecer la caducidad en este kit de herramientas, lo que significa que después de que pase este tiempo, y solo estoy configurando esto a 2 min. ¿Bien? Pero después de este tiempo pasar es que ya nadie debería poder acceder o utilizar este enlace para acceder al recurso. Yo estaba sentado en el protocolo para ser HTTPS y el recurso para ser B. Si pasas el cursor sobre el recurso, verás que B es específico para blob. Si es de un tipo diferente, puedes ver, puedes ver su dicho C para contenedor y tienes diferentes opciones. Pero por ahora solo estamos haciendo Blob Storage. Así que estamos configurando B como el tipo de recurso. Y luego voy a establecer el permiso para se lea el constructor de blob SAS. Entonces esta enumeración, es posible que deba incluir una referencia de uso faltante para esta enumeración. Pero aquí tenemos varias opciones. Se puede generar un token SAS que permita eliminar, para anuncio, etc, son todos permisos. este momento solo queremos leer porque queremos poder mirar la imagen cuando la recuperemos. Y luego vamos a devolver blob dot generar un token SAS con las opciones del constructor para no encadenar. Entonces esto va a apagarse, generar ese token SAS, darnos la URL completa también. Y luego nos va a devolver esa URL completa. Sepa cuando sigamos adelante, queremos eliminar ese blob cada vez que se elimine el registro. Entonces vamos a tener un método más aquí que va a eliminar blob. Así que la tarea pública AyncTask eliminó blob y estamos tomando ese nombre de imagen una vez más, conectándonos con el contenedor, creando un cliente blob. Y entonces sólo voy a decir, voy a esperar, blob dot delete, si existe, un fregadero. Esto es solo una sensación segura. Hay delete asincrónico, pero delete si existe. Colinas con si hay, si no existe, entonces no hay error, entonces podemos eliminar todas las instantáneas. Así que recuerda que con el almacenamiento de Blob tenemos versiones y cada vez que pueda haber una colisión, podría crear una nueva versión y mantener ese historial. Podemos optar por eliminar todo una vez que estemos eliminando el blob. Entonces eso es todo para el coordinador de nuestro Servicio de Almacenamiento de Blob. Yo sólo voy a seguir adelante y extraer esta interfaz. Y con esa interfaz extraída, saltamos a nuestro program.cs y registramos ese servicio de la misma manera que lo hicimos para el servicio de almacenamiento Table. No, podemos refactorial nuestros controladores y puntos de vista. Comencemos con nuestros controladores o controladores. Voy a inyectar el ojo Blob Storage Service e inicializarlo. Ya sabemos cómo hacerlo. Y luego para la acción de índice, voy a agregar esto para cada bucle, alguien que diga por cada ítem en detalle. Porque recuerda esto es devolver la lista de asistentes. Voy a decir que consiga el nombre de la imagen. Así que intento en el nombre de la imagen va a ser igual al servicio de almacenamiento de blob que obtenga la URL de blob, nombre de la imagen del punto del elemento. ¿Por qué estamos reemplazando ese valor? Bueno, no voy a estar almacenando toda la URL, solo estoy guardando el nombre, ¿verdad? Así que eso es extensión de punto de nombre único. Entonces me estoy pasando ese nombre, que va a tener la mancha. Entonces voy a obtener toda la URL SAS, que luego voy a reemplazar esta con para volver a la vista para mostrarla. Por supuesto, en un entorno más limpio habría creado esa abstracción y los modelos de vista de Singapur para que pudiéramos masajear mejor los datos y así sucesivamente. Pero renunciando a todas esas mejores prácticas, este es un claro ejemplo de cómo podemos simplemente seguir adelante y obtener la URL de los pulsos de este papel. A continuación tenemos los detalles. Entonces para los detalles están haciendo algo similar. Aquí tenemos el registro. Y entonces sólo voy a ver un registro punto imagen nombre es igual para obtener la sangre. Una vez más estás sin formato crear método post. He agregado un nuevo parámetro y ese es el parámetro del archivo I-Form. Por lo que este archivo I-Form capturará el File Upload desde el formulario que vamos a modificar y algunos. También he refactorial el código de la misma. Entonces comencé configurando una identificación a una nueva cuadrícula. Entonces estoy sentado la Clave de Fila para ser esta identificación. Ahora mi nombre único para nombrar mis archivos blob va a ser el ID. No tiene que ser la identificación. El ID va a ser único cada vez. Creo que es una manera fácil de investigar Blob Storage e identificar qué es lo que siempre que lo necesite. Entonces estoy viendo si la longitud del punto del archivo formulario, es decir, algo fue subido, correcto, es mayor que cero, entonces voy a seguir adelante y establecer ese nombre de imagen para que sea igual a lo que sea que esto devuelva. Así que recuerda que nuestro blob de subida, si voy a la implementación pegando eso y el nombre de la imagen, así que ese va a ser el ID. Vamos a seguir adelante y encajar eso, subirlo. Y luego sólo estoy devolviendo el resultado de la concatenación del id y la extensión. Entonces eso es lo que vamos a terminar con el nombre de la imagen. Y entonces si no se subió nada, podemos configurarlo como una imagen por defecto. Bien, y luego seguimos adelante y absurmos al asistente. Pasemos a nuestra edición y edición. Simplemente estamos haciendo lo mismo si check, donde si el archivo de formulario es mayor que cero, entonces seguimos adelante y subimos nuestro blob. Estoy pasando ese valor de clave de fila y el archivo de formulario que agregamos como parámetro también. Ahora una cosa en la vista que no creo que señalé, si voy a la Vista aquí, asegura de que recordemos que habíamos eliminado los valores de entrada para la clave de fila, clave partición, y la marca de tiempo. Pero para conservar la clave de fila original para el registro, asegúrese de tener ese ASP oculto para Clave de fila en el formulario. Bien, así que eso es Editar. Y luego finalmente vamos a la eliminación. Eliminar es un poco complicado ahora porque necesitamos el nombre de la imagen original para eliminar el blob. Entonces lo que tenía que hacer era Fitch, el asistente primero. Entonces podemos eliminar eso y luego podemos eliminar el blob sin pasar por esos datos, ese nombre de imagen, porque primero lo recuperamos, lo tenemos en la memoria. Podemos eliminarlo del almacenamiento de la tabla y luego usar lo que almacenamos en la memoria, luego empacarlo con esos datos para la eliminación. Por último, veamos los diferentes cambios que hicimos a las opiniones. Entonces, para la vista de creación, he agregado una nueva sección que nos permitirá subir el avatar. Así que acabo de crear un nuevo grupo de formularios. Tenemos la etiqueta aquí y acabo de escribir subir nuestro alquitrán. Y entonces el tipo de entrada es file, y el nombre aquí es file formado para que corresponda con el parámetro que estamos buscando en el post. Y eso es todo para nuestro Create. Y mis habilidades para copiar y pegar se me salieron de control. Así que déjame quitar esas cosas de validación. Y necesito este mismo control dentro de la edición. Así que solo agregaré este grupo de formularios al formulario de edición también. Entonces si no se sube nada, está bien porque nos quedamos el mismo blob y todo está bien. No obstante, si algo se sube, entonces subimos y éste hará el reemplazo en consecuencia. Ahora en la vista de detalles, he agregado otra combinación DT DD a esta lista de datos. Entonces aquí tengo Avatar y ahora tengo esa etiqueta de imagen, que va a tomar se obtiene del nombre de la imagen del punto del modelo. Y solo estoy sentado nuestro ancho de 150 y una altura de 150. Después en el índice, he agregado otro encabezado de tabla. Y si quieres etiquetarlo, podrías decir avatar o mostrar imagen, sea lo que sea. Y luego en el TR para los datos, he agregado un nuevo td, que es una etiqueta de imagen similar. La fuente va a ser el nombre de la imagen del punto del elemento, y el ancho va a ser 50 y la altura es 50. ¿Bien? También hemos refactorizado la forma de bits para poner los enlaces HTML dentro del foro para que se muestren de izquierda a derecha en lugar de esa exhibición fortuita que teníamos antes. Sé que dije que no necesitábamos arreglarlo, pero lo siento, no pude continuar con nuestra fijación. Entonces solo pongo esos dos enlaces dentro del formulario justo al lado del botón Eliminar enviar. Y he agregado los nuevos atributos HTML para la clase, advertencia BTN para editar y btn-primary para detalles. Entonces con todos esos cambios realizados, sólo voy a guardar todo. Y cuando volvamos, haremos nuestras pruebas. 14. Características de servicio de prueba de Blob: Un ajuste rápido antes de saltar a las pruebas. Recuerda que siempre que queramos facilitar subidas de formularios o archivos en un formulario, necesitamos incluir este atributo en el formulario. Así que me olvidé de señalarlo en la lección anterior que estamos retrofitting o views. Entonces, el tipo de tinta es igual a los datos de forma de barra diagonal de varias partes. Así que asegúrate de que eso esté presente en el formulario de creación, así como en nuestro Formulario de Edición. También voy a agregar este campo oculto al Formulario de Edición para asegurarnos de que podamos conservar el valor del nombre de la imagen. Así que recuerda que necesitamos conservar el nombre original de la imagen. Y si el usuario sube y nueva imagen, entonces cambiaremos esa vieja. Pero necesitamos mantener los nombres de las imágenes originales para que cuando hagamos un upsert, ese valor no se pierda. Ahora saltemos a nuestra edición. Post acción y acabo de ir a ajustes son necesarios aquí. Uno, quiero mover esta declaración si arriba porque lo que hicimos fue que lo absurmos antes incluso intentamos verificar si deberíamos actualizar el archivo. Y también debemos actualizar el campo de imagen. Mencionaste campo de nombre, ¿verdad? Así que descuidamos esa parte en nuestro propio paso, pero podemos corregirla ahora. Por lo que debemos verificar si la longitud del archivo de formulario es mayor que cero. Y todas las cosas que forman archivo también podrían ser nulas. Entonces voy a hacer que este tipo de no sea seguro. Pon ahí ese signo de interrogación. Entonces, si el archivo de formulario tiene un valor, verificamos la longitud si es mayor que cero. Y claro que también podríamos simplemente comprobar si no es igual a null porque obviamente entonces tendría una longitud, pero cualquiera que sea la comprobación con la que te sientas más cómodo, entonces seguimos adelante y decimos, conseguir que el nombre de la imagen sea igual a lo que se haya subido. Si subimos algo, entonces vamos a asumir que somos nuevos, necesitamos actualizar ese nombre de imagen. Y entonces podemos seguir adelante y upsert. Ahora sigamos adelante y probemos nuestro sitio de datos, limpiamos todos los registros existentes porque estaba probando todo y no creé otro registro para realizar esta prueba. Entonces, si quieres limpiar todos tus registros de almacenamiento de mesa existentes, siempre puedes volver a tu navegador de almacenamiento o usar el Explorador de almacenamiento que hayas descargado. Baja a tablas y verás la tabla que habíamos creado previamente y luego podrás eliminar cualquier registro que consideres que necesites eliminar. Ahora, cuando me ejecute, ejecute esta aplicación y navegue para asistir al registro y veamos nuestra mesa. Déjame crear un nuevo disco y voy a subir un avatar. Y voy a elegir una imagen aquí y darle FirstName, apellidos, dirección de correo electrónico e industria y Create. Y ahí vamos. Entonces ahora estoy viendo una imagen que se muestra aquí en Avatar. Mira eso. Y estoy viendo todos los datos que se utilizaron para saber qué es esta imagen. Si hago clic en Detalles, me sale un enlace roto. Así que claramente tenemos que hacer algo de trabajo aquí. Y lo que voy a hacer es inspeccionar elemento. Y ahí vamos. Ese es el error. Oye, en realidad es imprimir las palabras, modelar esa imagen. Así que saltemos por encima y arreglemos eso donde debería estar esto en realidad a la señal. Y ese no debería ser poco modelo, ese debería ser el modelo M grande para representar los datos. Entonces déjame seguir adelante y arreglar eso y volver a ejecutarlo. Y cuando vuelvo a cargar ese registro aquí, ¿la imagen se muestra correctamente? No, aún tengo mi Elemento Inspeccionar abierto. Y si miras esa URL, verás que esta es la URL del blob real. Así que vamos a revisar lo que todo el asunto de la URL es un perno. Si salto de nuevo al portal y actualizo, veremos nuestro registro y/o registro tiene nombre de imagen. Esa es la misma extensión de punto de valor, por supuesto, que la clave de fila. Eso está bien. Una vez más, cambiamos el nombre para que podamos tener singularidad en cada subida. Ahora bien, si salto a los contenedores de blob, lo primero es que verán que se crearon las imágenes de los asistentes y se crea como un blob o contenedor privado, ¿verdad? Si entro, atiendo las imágenes, cada blob de bloque que esté dentro de este contenedor también va a ser privado. Así puedo ir aquí y puedo copiar la URL. Si intenté ir a esa URL, voy a recibir este mensaje de que el recurso especificado no existe. Ahora sabemos que eso no es cierto porque aquí está esa URL al almacenamiento de Blob y luego al contenedor y luego el nombre del archivo y simplemente lo copiamos para que sepamos que el archivo existe. Entonces, debido a que está configurado como privado en el nivel de acceso, no podemos acceder directamente a él a través de la URL. Una vez más, con base en el nivel de acceso, podemos habilitar o restringir el acceso mayorista a todos los blobs en nuestro contenedor. Ahora bien, esta es privada. Por eso generamos esa URL SAS. Y luego cuando haga clic en generar SAS, verá que ahora podemos configurar todos esos parámetros y luego podemos generar el token SAS y la URL. Y luego una vez que se haya generado ese Tolkien y URL, si copio esto y luego intento volver a ir a él en el navegador. Bueno, mi navegador en realidad está descargando el archivo. Bien, así que eso es lo que sucederá si estoy usando, si estás usando ciertos navegadores, en otros navegadores, en realidad abrirá el archivo. Pero veamos la URL para un poco de pegarla en Notepad Plus, Plus para que podamos inspeccionarla un poco más. No, empezamos una vez más con las mismas partes, el almacenamiento de conos, el contenedor, y luego el nombre del archivo. Y entonces notarás que tienes una cadena de consulta. Entonces tenemos a Sb, ese es el permiso, eso es todo a nuestro Windows. Se inicia. Bien. Ese es el momento. ¿Cuándo termina? Ese es el momento. ¿Cuál es el protocolo? Https, y luego tenemos otros parámetros. El tipo es blob y la firma es esa cadena degenerada aleatoria. Y SV ahí representa una versión firmada, ¿verdad? No establecerías eso, eso se establecerá mientras se esté generando la firma. Eso es lo que aporta este token SAS a la tabla donde obtenemos esta URL especial que permite acceder tanto tiempo como nos sentamos entre la hora de inicio y finalización. Y ven aquí, esto se fijó para un día. Esto solo estaba usando las opciones predeterminadas. Pero claro que podemos establecer un lapso de tiempo que sea específico para el propósito para el que necesitamos ese token. Ahora que tienes una idea de lo que está sucediendo detrás de escena cuando estamos obteniendo esa URL. Vamos a saltar a Editar. Y cuando editemos con fetch el registro, déjame intentar cambiar este archivo. Y después de hacer clic en Guardar, encontré un error. Entonces claro que quiero mostrarte el IRS y luego vamos a trabajar juntos a través de ellos. Entonces el error aquí que se capturó después de intentar subir blob fue que el blob especificado ya existe. ¿Bien? Entonces claro que no podemos subir un blob que ya tenga ese nombre. Entonces lo que voy a hacer es quitar el blob si ya existe, y luego podemos seguir adelante y crear. Entonces para subir blob, vamos a saltar por encima para subir blob y vamos a modificar lo que está sucediendo dentro de este método. Entonces tal y como está, solo vamos a ir al contenedor e intentamos subir. Y si pasas el cursor sobre eso, verás donde dice que crea un nuevo blob de bloque, lo que significa que obviamente devolverá una excepción, como has visto, donde ya existe el blob. Entonces por eso es muy importante leer documentación. Para sobrescribir un blob de bloque existente, obtenga un cliente de blob y luego cárgalo. Muy bien, tomaremos las instrucciones para que podamos reutilizar esta línea donde obtuvimos ese cliente de blob y reemplazar esta línea de carga original una nueva que diga un wet blob dot upload asincrónico. Y luego estoy pasando, estoy usando parámetros con nombre, así que sepa exactamente lo que estamos pasando en donde el contenido va a ser el flujo de memoria. Y entonces vamos a sobrescribir true. Entonces, al establecer override en true , sobrescribirá cualquier blobs existente. Y sin establecer que sería falso. Entonces termina obteniendo la misma excepción que obtuvimos si descuidamos poner ese parámetro de anulación. Ahora hay otro giro en esto. Y es eso lo que si subí una clavija J inicialmente y luego la cambio a un PNG. En ese punto, aunque el valor id, el nombre de la imagen sea el mismo, vamos a terminar con dos archivos diferentes. Y realmente necesitamos almacenar archivos antiguos, ¿verdad? Entonces, técnicamente hablando, también podrías ejecutar una eliminación antes de hacer la carga solo para asegurarte de que no termines con dos versiones diferentes de lo que debería ser el avatar de una persona. Así que puedes considerar eso también. Entonces para cumplir con eso sucedió en la acción de edición, voy a enviar sobre el nombre de la imagen original como parámetro a nuestro método upload blob, lo que significa que ahora tendremos que introducir un nuevo parámetro. Entonces nuestro nuevo parámetro va a ser string, que no es audible el nombre original de Blob. Y lo estoy inicializando para que no. Y por supuesto si actualizamos la interfaz, entonces también debemos actualizar la implementación. Y tenemos el mismo parámetro enumerado aquí. Entonces ahora que tenemos este valor original del nombre de Blob, voy a comprobar si existe. Entonces voy a decir, si no string dot es nulo o vacío y pasar en ese valor, entonces queremos esperar, eliminar blob y darle ese nombre original de Blob. Vamos a eliminar el blob existente y luego podemos seguir adelante y subir. Entonces ves que hay muchas dinámicas a distinto en nuestro caso porque podríamos terminar con diferentes archivos y extensiones y no podemos garantizar que esto siempre va a sobrescribir el existente. Es más seguro para nosotros quitar el viejo y luego agregar el nuevo. Mientras que en una situación en la que tal vez el nombre del archivo siempre va a ser consistente independientemente, entonces probablemente no tengas que pasar por todo eso. Pero una vez más, opciones. Entonces ahora que hemos hecho estos ajustes, así que sigamos adelante y probemos nuestras ediciones. Otra vez. He cargado el formulario, ya elegí mi otro archivo, y luego ya veré. Y ahí vamos. Ahora tengo un Avatar completamente nuevo. He cambiado con éxito la carga o la imagen Blob asociada a ese registro. Así que eso es agradable y fácil. Por supuesto, tenía algunos matices. Conoce el mismo ejemplo que di donde la extensión de archivo puede ser diferente y terminaremos con múltiples archivos para el mismo disco que realmente tenía eso me pasó. Entonces aquí hay una versión con JPEG y otra con PNG, el origen de los archivos PNG, el nuevo archivo era JP, y en lugar de reemplazarlo acaba crear una nueva necesito desreferencia. Entonces es por eso que es posible que desee eliminar antes de subir para asegurarse de que no termina con múltiples archivos potenciales. Incluso este fue subido sin extensión antes. Esas son pequeñas cosas con las que querrás tener cuidado, tener cuidado y prestar atención a la hora de manejar manchas. Por último, voy a probar esa eliminación. Así que vamos a eliminar este registro y sabemos que el almacenamiento de la Mesa que lo requería fue eliminado. Volvamos a saltar por aquí y al menos uno de estos archivos debería irse. Bien, dos de ellos fueron porque me quité el original. Entonces también eliminé el que se adjuntó al registro. Este se adjuntó a nada así que puedo borrar éste manualmente. Eso está bien. Pero al menos ahora sabemos que estamos escribiendo con éxito en nuestro almacenamiento de blob, leyendo de nuestro almacenamiento de blob usando un ensayo, un tallo. Y eso nos da acceso limitado solo para el periodo. Y somos capaces de eliminar y subir una nueva, Cambiar asociaciones de archivos y todo por el estilo. Ahora cuando regresemos, vamos a implementar nuestro servicio de cola. Y los escenarios que quiere un asistente se ha registrado. Queremos enviar un correo electrónico, pero no queremos conectarnos directamente al servicio de correo electrónico. En cambio, queremos agregarlo a una cola para que pueda consumirse más adelante, sin procesar. 15. Agregar servicio de cola: Entonces ahora vamos a implementar nuestros mecanismos de cola. Entonces lo primero que voy a hacer es crear un nuevo modelo. Estoy haciendo modelar conjunto de datos porque no es algo que vamos a almacenar. Pero sí quiero una clase para que podamos tener un mensaje fuertemente mecanografiado en consecuencia. Entonces voy a llamar a este mensaje de correo electrónico. Y el mensaje de correo electrónico va a tener tres propiedades. Entonces el primero va a ser una cadena, que es la dirección de correo electrónico. Entonces vamos a tener marcas de tiempo. Entonces solo voy a decir fecha, hora llamada esta marca de tiempo. Y lo último es el mensaje real. Entonces eso es bueno por ahora. Y entonces como de costumbre, vamos a tener que sentarnos en un nuevo servicio. Entonces, sigamos adelante y agreguemos otro clúster o carpeta de servicios. Esta vez, vamos a llamarlo q servicio. Y nuestro servicio de cola va a tener un constructor que va a inyectar o nuestra configuración similar a otros servicios, también vamos a tener un nombre de cola establecido, que estoy llamando correos electrónicos de asistentes. Ahora sólo voy a tener un público que es tarea de una tarea pública llamada enviar mensaje. Y enviar un mensaje va a tomar el objeto de mensaje de correo electrónico. Entonces mensaje de correo electrónico, y solo lo llamaré mensaje de correo electrónico. Y la cosa es que estoy codificando duro en esta cola. Pero es posible que también desee mantener este tipo de flexibilidad a otras señales con las que pueda necesitar interactuar. Entonces, lo que podría hacer por este servicio de cola es en lugar de establecer ese nombre de cola, en realidad podría simplemente decir nombre de cadena como parámetro aquí. Para que realmente puedas establecer el nombre de la cola cuando estés pasando por encima del mensaje que deseas. Pero entonces esta es una específica. Entonces solo voy a hacer todo específico para nuestra operación de mensajería por correo electrónico. Ahora voy a inicializar un cliente de cola y no voy a molestarme crear un método completo para eso esta vez porque solo tenemos un mensaje, un método que es mensaje enviado. Así que fui a decir var cliente agudo es igual a un nuevo cliente de cola donde necesitamos la cadena de conexión. Eso lo obtenemos de la configuración. Obtenemos el nombre de la cola en base a este valor. Y luego configuramos opciones del cliente de cola para que sea mensaje que codifique el 64. Así que recuerda que pospongamos, encendemos y apagamos esto. Cuando estamos creando la cola en sí. Entonces como de costumbre, vamos a ver cliente Q o un punto de espera clientes de cola crear, si no, existe, un sumidero. Entonces seguimos adelante y nos aseguramos de que exista antes de intentar mandar un mensaje. Para enviar un mensaje, simplemente podemos decir Q Client dot send message. Y claro que hay una opción asíncrona, pero déjame seguir adelante y poner en lo que debería ser el mensaje. Así que observe que estos esperan un texto de mensaje de cadena, pero tenemos un objeto de mensaje de correo electrónico. Entonces déjame seguir adelante y voy a esperar primero. Ahora, ¿cómo convierto esto en algo que se pueda enviar como cadena? Bueno, podemos serializarlo para que sea JSON. Entonces puedo decir var message es igual a JSON, convertir ese objeto serializado. Y luego pasamos en nuestro mensaje de correo electrónico que simplemente convertirá nuestra clase en un mensaje JSON o un objeto de cadena JSON. Y entonces podemos pasar esa cadena por encima como nuestro mensaje. Podemos extraer nuestra interfaz. Ese es el único método que necesitamos para extraer la interfaz, seguir adelante y registrarla en el program.cs como de costumbre, y la estamos agregando como esculpir al igual que los otros servicios anteriores a ella. Y entonces podemos modificar o las crestas están asistiendo al control de registro. Y después de haber inyectado o nuevo servicio IQ, servicio IQ, me gusta ese nombre. Ahora podemos modificar los hotspots. Así que obviamente crea sería un hotspot donde después de que todo esté hecho y hayamos guardado, entonces queremos crear nuestro mensaje de correo electrónico. Entonces puedo decir var email es igual a nuevo mensaje de correo electrónico. Y voy a configurar la dirección de correo electrónico para que sea la entidad asistente punto dirección de correo electrónico que se ingresó. Derecha. Podemos establecer la marca de tiempo que sea una fecha y hora UTC know, y luego podemos configurar nuestro mensaje para que sea algo así como hello, firstName, lastName, hello. Y sólo estaban concatenando. Entonces estamos usando, bueno, interpolando. Entonces estamos usando la interpolación aquí. Y luego traje la línea con la barra diagonal trasera n, barra diagonal reversa r. Gracias por registrarse para este evento. Y tengo un recto hacia arriba. Y luego volví a traer la línea y luego dije, su expediente se ha guardado para futura referencia. Entonces ahora que tengo este objeto de correo electrónico, puedo llamar a mi servicio de cola y C, enviar mensaje y simplemente dárselo a esos objetos de correo electrónico. Por supuesto, sabemos que podemos hacer cosas similares en otra parte nuestra aplicación porque si se edita, entonces podríamos hacerles saber que no se ha modificado. Entonces hola, FirstName, LastName, tu registro fue modificado con éxito y luego te enviamos ese mensaje. Y luego si se borra, también puedo hacer eso porque recuerden, habríamos precargado esos datos aquí. Entonces después de que todo haya sido eliminado, seguimos adelante y creamos nuestro mensaje de correo electrónico y copié y pegué. Entonces, obviamente, usaríamos los datos como el objeto aquí para la dirección de correo electrónico, FirstName, LastName. Entonces se modifica el mensaje de correo electrónico para decir que se eliminó con éxito, luego enviamos. Entonces eso es todo lo que integraríamos nuestro servicio de colas en nuestras operaciones. Ahora cuando volvamos, vamos a validar todo esto. 16. Servicio de colas: Así que sigamos adelante y probemos a alguien para crear un nuevo disco y subir una imagen. Y, por supuesto, solo estamos usando test, test, test e IoT creados por la industria. Y una vez que validamos eso, tenemos un registro y nuestro blob subido, podemos saltar a nuestro Explorador de almacenamiento. Y voy a refrescar todo para que pueda ver si esa nueva cola o raqueta de tenis apunta y decir Refresh. Y ahora veo los correos electrónicos de los asistentes como mi cola y salto ahí. Y tengo varios mensajes porque estaba probando, ¿verdad? Puedes ver aquí que tenemos varios mensajes e hice unas operaciones crud completas para asegurarme de que cada uno funcionara. Entonces tengo uno aquí que muestra cuando se creó tu disco no se ha guardado para futuras referencias. Eso es bueno. Y luego tenemos otro aquí que dice que se eliminó con éxito. Tenemos otro aquí que dice que estuvo bien, no hice ninguna modificación, pero ven aquí que todos estos mensajes están en realidad haciendo cola. Así que imaginemos ahora que el servicio de correo electrónico era en realidad no, ¿verdad? Entonces estos deberían haber sido correos electrónicos que se envían de inmediato. Pero nuestro servicio de correo electrónico era amanecer. Eso significa que el usuario se habría registrado y podríamos haber salido de la operación con la impresión de que es o una distribución en campo. Debido a que el servicio de correo electrónico se hizo el campo del sitio web para conectarse y luego lanzar una excepción y probablemente le dio un mensaje de error. No queremos que eso suceda, ¿verdad? Otro escenario es que bien, tal vez tengamos un manejo adecuado de errores en su lugar. Entonces, a pesar de que el donante de servicios de correo electrónico intentamos conectarnos, no lanzamos una excepción, pero entonces ese correo electrónico se pierde para siempre, ¿verdad? Entonces, el coeficiente intelectual es una excelente manera de mantener nuestros mensajes para nuestras operaciones hasta que podamos procesarlos más adelante. Cuando volvamos, ahora que sabemos que nuestro q está funcionando como esperamos, vamos a construir una pequeña utilidad que realmente va a recoger los mensajes de la cola. Y una vez que recibamos los mensajes de la cola, cualquier operación en ella es que necesites llevar a cabo, se puede llevar a cabo. 17. Logs y llamadas de servicios: Ahora mientras estamos probando nuestra aplicación, solo quería tomarme unos segundos para señalar lo que está sucediendo en la consola, solo para que tengas una sensación de lo que está sucediendo detrás de todas estas llamadas de servicio. Así que hemos conectado nuestro servicio de mesa o servicio almacenamiento de blob y nuestro servicio de almacenamiento en cola. Y si miras la consola o los registros que está escupiendo la aplicación para cada solicitud, verás que solo estamos enviando GET y post y diferentes tipos de solicitudes HTTP o solicitudes HTTPS a un montón de URL. De verdad y de verdad, no es mucho más complicado que eso. Entonces, esencialmente, nuestros clientes de servicio y todos esos son realmente solo envoltorios para clientes HTTP que se comunican a través de APIs RESTful con cada uno de nuestros servicios. Y sí dijimos al inicio del curso que las APIs RESTful sí nos permiten interactuar y administrar o recursos aquí es un ejemplo en vivo de trabajos de holdout. Entonces, cuando estamos hablando con nuestro servicio de mesa, cuando rp se carga, intentamos obtener los datos. Bien, y más tarde verás que interactuamos con, bien, aquí hay uno donde obtenemos una herramienta para. Derecha. Aquí está el que quería donde borré el disco. Por lo que borró del Blob. Entonces, si miras la URL, verás que ese es el servicio blob, ¿verdad? Y borró ese nombre de Blob. Y esa es una solicitud de eliminación. Bien, aquí está la salida donde se actualiza algo en la Q. Bien, así que esa es la URL del servicio de cola. Y aquí hay una solicitud de post donde se creó algo bajo Q. Y aquí me sacan sacando de las mesas. Así que solo estoy señalando que todo es realmente solo una llamada a la API RESTful que ocurre en segundo plano. 18. Configurar el lector de mensajes de cola: Ahora que sabemos que nuestro servicio está funcionando, construyamos un servicio que se suscriba a este servicio de cola y luego consuma el mensaje. Y entonces sea lo que sea que tengas que hacer con él puedes después. Pero construyamos una utilidad que se conecte y consuma estos mensajes. ¿Qué es lo que voy a construir una app de consola? Entonces voy a, en la solución, abrir un nuevo o agregar un nuevo proyecto. Y esta va a ser una sencilla app de consola. Así que elige una plantilla de aplicación de consola. Y vamos a llamar a esta consola punto q consumidor puntos demo. Y luego seguiremos adelante y golpearemos Siguiente. Usaremos los siete latest.net disponibles en el momento de la grabación y Create. Ahora necesito agregar un paquete, y necesito agregar el mismo paquete que habíamos agregado anteriormente para el almacenamiento en cola, que es colas de almacenamiento de punto cero. Así que sólo voy a rápido y creo que a estas alturas todos sabemos un todo para agregar o paquetes rápidamente. Entonces voy a elegir esta ruta donde solo voy a crear un nuevo grupo de ítems y luego simplemente pegar la misma referencia de paquete que estaba en la app MVC. Y guarda eso. Y se te va a ir en segundo plano y resolver esa dependencia por mi. Ahora escribamos algún código. Lo primero que nos gustaría hacer, por supuesto, es configurar el o establecer la conexión con nuestro almacenamiento de colas, ¿verdad? Y eso se hace a través de nuestra cadena de conexión de cuenta de almacenamiento. Sepa, tiene algunas opciones cuando está haciendo esto, la opción más fácil sería simplemente crear una variable aquí. Me llaman la cadena de conexión y le dan el valor. Pero entonces por la obvia razón de que no quieres poner tu cadena de conexión directamente en código y capa codificada que no vamos a tomar ese enfoque. Para esta situación, podemos usar un secrets, lo que significa que tendríamos que instalar algunos paquetes adicionales y almacenarlo en un archivo de configuración y luego referenciarlo en consecuencia. Y luego por extensión, también podemos simplemente establecer una variable de entorno global en nuestra máquina. Y entonces claro, si vamos a desplegar esta aplicación en cualquier otra máquina, tendrán que asegurarse variable de entorno también exista allí alguien que tome ese enfoque para este ejercicio en particular. Entonces para hacer eso, vamos a usar nuestra ventana de terminal. Y ya sea que estés usando, si estás en una máquina con Windows, vamos a usar el siguiente comando. Y luego te voy a mostrar el correspondiente para Linux y macOS. Si estás en una máquina con Windows, ya sea que estés usando código de Visual Studio o Visual Studio, puedes decir set X, nombre de pila, estoy viendo como tu cadena de conexión de almacenamiento. Y luego colocamos aquí el valor. Así que solo voy a saltar al proyecto web donde teníamos el valor de la cadena de conexión de ejercicios anteriores. Y voy a usar eso aquí como valor y conjunto. Asegúrese de obtener el formato correcto. Se puede ver que tuve algunos errores porque copié una y una coma y agregué comillas adicionales. Así que solo asegúrate de obtener solo las comillas y el valor intermedio. Ahora bien, si estás usando Linux o Mac OS, el comando es básicamente idéntico. Pero en vez de decir set X, vas a ver exportaciones. Y es el mismo formato para exportar el nombre de la variable y luego el valor. Una desventaja de este método es que es posible que deba reiniciar su computadora después para que pueda presionar Pausa, reiniciar, y cuando regrese, retomaremos donde lo dejamos. Así que ahora que hemos establecido esa variable de entorno, podemos establecer la variable de cadena de conexión aquí. Así que voy a decir cadena cadena conexión es igual al entorno, obtener la variable de entorno, y nos encontramos con que por su nombre. Bien, entonces vamos a inicializar una nueva cola de clientes. Y eso va a ser similar a lo que hemos hecho antes. cliente lindo Q es igual al cliente nu q, haciendo referencia a la cadena de conexión y al nombre de esa Q. voy a intentar obtener mensajes de la cola. Entonces lo primero que quiero hacer es asegurarme de que exista el QA, que es solo lo rudimentario, ¿verdad? Si espero, Q punto Q existe. Y luego dentro de esta declaración if, voy a seguir adelante y comprobar hay muchos mensajes enteros. Así que antes que nada para conseguir la propiedad. Entonces digo q propiedades es igual a nuestro peso q punto obtener propiedades un fregadero. Y luego una vez que tenga esas propiedades, ahora puedo comprobar si cuál es el aproximado, perdón, conos de mensaje. Voy a decir mientras propiedades que aproximan el mensaje d de Cohen es mayor que cero. Bien, entonces ese es solo un número que indica cuántos mensajes hay en la cola. Y luego estoy configurando un bucle while para decir, bueno, mientras hay mensajes en la cola, entonces queremos hacer algo. Entonces voy a ver seguir adelante y buscar los mensajes. Así que voy a decir string message es igual a y voy a esperar método que estoy a punto de crear, recuperar. siguiente mensaje es sink, o no necesariamente tenemos que seguir esa convención de nomenclatura asincrónica. Pero sí quiero recuperar, déjame obtener mi ortografía correcta. Y luego voy a decir consola punto, escribir línea, e imprimir ese mensaje. Y yo sólo estoy poniendo la palabra recibida. Implementemos este método. Entonces solo voy a degenerar el método a continuación. Va a ser un método asincrónico que devuelve una cadena. Y dentro de este método, voy a recuperar primero un mensaje. No, puedes recuperar hasta varios mensajes a la vez, ¿verdad? Así que quería decir mensaje de cola, mensaje recuperado, y esto es una matriz. Y luego fui a esperar el punto Q recibir mensajes asincrónicos. Y entonces podemos tomar un cono. Este cono es el número máximo de mensajes y el mínimo es uno y el máximo es 32. Así que en realidad puedo decir, dame hasta 32 mensajes uno a la vez. Pero por ahora sólo voy a hacer una. Entonces los vamos a procesar uno por uno. Y luego voy a tener que convertir de base-64 en una matriz de bytes, y luego de una matriz de bytes en una cadena. Te voy a explicar todo esto. En nuestro Explorador de Almacenamiento. Cuando estamos viendo nuestros mensajes, vemos que el mensaje se pega en texto plano y eso se ve bien. Sin embargo, cuando hagas doble clic en él, verás que te está mostrando que lo ha decodificado como base-64. Entonces me está mostrando lo que hay en el mensaje. Pero realmente y verdaderamente si lo mieras en reposo, si alguien quiere tener acceso a la cola y solo tratar de ver que los mensajes están tratando de interceptar los mensajes en lugar de que solo verían una cadena codificada en base 64 que en realidad no vería los textos como lo estás viendo. No. Entonces, por esa razón, cuando estamos procesando estos mensajes, en realidad están llegando como mensajes codificados en base 64. Y entonces tengo que convertir de base 64, ¿verdad? Entonces esta es la base-64 codificada entonces cadena. Entonces esto es en realidad datos binarios, ¿verdad? Y luego puedo volver a convertir a UTF a partir de ese RE beta. Entonces eso es todo, todo ese flujo tiene que funcionar. Si estamos usando codificación base-64, entonces después de haber recuperado el mensaje de la cola, me gustaría eliminarlo. Entonces voy a decir un peso q punto eliminar mensaje asincrónico. Y vamos a eliminar usando el mensaje recuperado que el ID del mensaje y su recibo pop de mensaje recuperado. Bien, y si pasas el cursor sobre estas propiedades, verás lo que significa cada una de estas. Así que esencialmente después de haber procesado el mensaje o hemos recuperado el mensaje y podemos eliminarlo de la cola. Y luego voy a devolver el mensaje, que luego podremos procesar. Eso no lo recuerdo. Sí, vamos a consolar esa tierra de ratas, pero esto fácilmente podría ser enviar el correo electrónico o almacenar en la base de datos. Porque si es una operación asíncrona y es algo que tiene que suceder después. Como dijimos antes, sobre todo en una situación de microservicios, estos podrían haber sido los agentes que nodo hace la pata de anclaje fuera cualquier proceso que el sesgo esté conduciendo, ¿verdad? Entonces esta es solo una aplicación de consola simple. En un escenario de la vida real, probablemente usarías nuestro trabajo o servicio que siempre está encendido, que tendrías que ejecutar manualmente cada vez. El código se vería más igual con nuestro trabajo o servicio. Si fue como tu función, que veremos más adelante en el curso. Entonces veremos cómo podemos manejar este tipo de situaciones también. Así que sigamos adelante y probemos y voy a establecer algunos puntos de interrupción en algunas áreas clave. Esto es solo para que podamos rastrear exactamente lo que está sucediendo a medida que pasa el cable. Así que voy a asegurarme de que la consola arriba es mi proyecto predeterminado y seguir adelante y ejecutar con la depuración. Y llegamos a los primeros puntos de interrupción para que podamos estar seguros de que la Q sí existe. Y luego sólo voy a saltar al bucle while. Entonces siguió adelante y buscó las propiedades. Veamos ese objeto y vemos aquí que el cono de mensaje aproximado es cinco. Entonces por eso, saltamos a nuestro bucle while. Y luego seguiremos adelante y recuperaremos el siguiente mensaje. Y solo presionaré F5 para que salte hacia abajo. Vamos a evaluar. Primero recibimos un mensaje, no, porque se trata de mensajes, aunque especifiquemos uno, todavía va a devolver una matriz o tipo de colección. Así que realmente y verdaderamente, va a devolver una matriz con ese número de mensajes. Entonces obtenemos una matriz en este caso con un mensaje, eso está bien. Ahora cuando veamos este objeto de mensaje recuperado, veremos que tenemos nuestro cuerpo. Tenemos unos conos de descola, es decir, ¿cuántas veces fue rojo este mensaje? Tenemos un caduca basado en las diferentes configuraciones que habríamos configurado y tenemos textos de mensaje, por lo que tenemos todas esas propiedades en este objeto de mensaje, objeto de mensaje de cola. Ahora, observe que body es una cadena codificada. Entonces de esto es de lo que estamos hablando. Esto no tiene sentido que ningún ser humano, a menos que estés caminando por computadora. Así que vamos a hacer es convertir eso una cadena y luego convertirlo en una matriz de bytes. Y luego vamos a convertir de la matriz de bytes en una cadena real. Entonces vamos a eliminar el mensaje, porque ahora que hemos recuperado el mensaje, ya no lo necesitamos en la cola. Entonces este es el mensaje que es ese cuerpo JSON del que hemos hablado o que vimos en la vista previa. Por lo que ahora podemos proceder a eliminarlo. Y luego se devuelve el mensaje. Y solo voy a presionar Continuar y eliminar los puntos de interrupción para que todos los mensajes se impriman en la consola. Y aquí tengo una excepción. 19. Limpieza de códigos y optimización: Bien, bienvenidos chicos. En esta lección solo vamos a hacer algunas optimizaciones de código y limpiar. Y la primera actividad de limpieza de barra diagonal de optimización nos lleva vuelta a la aplicación de consola que acabamos de hacer. Entonces, lo que he hecho es que he reemplazado el bucle while por un bucle for. Ya que estoy recibiendo un número definido de mensajes, tiene sentido simplemente pasar por un número diferente de veces, ¿verdad? Entonces eso definitivamente nos ayudará a superar ese índice de error fuera de límites ya que solo llegaremos hasta aquí una vez que estemos dentro de los conos. Entonces ese es nuestro rápido refactor. Por supuesto, hay varias formas en las que podríamos hacer esto y eso fue solo un lapso de juicio de por qué terminé haciendo el bucle while en primer lugar. Oye, vivimos, aprendemos. Entonces esa es nuestra primera corrección. No, quiero volver mi atención al proyecto web y al hecho de que bien, tenemos el almacenamiento o cadena de dos puntos aquí. Pero luego en nuestros servicios como Blob Storage, Queue storage y almacenamiento en mesa, estamos instanciando a un cliente cada vez. Así que probablemente podamos refactorial eso es un poco. Así que comencemos por conseguir un nuevo paquete. Y yo solo voy a usar la consola del desarrollador aquí para que todos podamos estar en la misma página, ya sea que estés usando Visual Studio o Visual Studio Code. Y en el proyecto web, voy a dotnet agregar paquete. Y el paquete es Microsoft extensiones de punto que como tu. Ahora eso nos dará la posibilidad repasar a nuestro program.cs. Y mientras está instalando, empiezo a escribir el código. Así que eso me da la posibilidad de ir al program.cs y ver un constructor puntos servicios, y agregar como sus servicios o sus clientes más bien. Entonces puedo inicializar esto con un constructor y el cuerpo lambda y terminarlo con punto y coma. Entonces, ¿qué estamos haciendo dentro de esto? Añadir un cero glándulas. Bueno, ahora puedo decir constructor. Puntos, agregar clientes. Entonces ven aquí, no, puedo agregar cliente de servicio de blob, puedo agregar planes de servicio de cola, y puedo agregar cliente de servicio de mesa, todo eso aquí mismo. Así que comencemos con agregar cliente de servicio de blob, y tenemos varias sobrecargas. La sobrecarga más fácil de usar es la que requiere una cadena de conexión. Así puedo saltar a la configuración y solo obtenemos esta cadena de conexión de almacenamiento. Y vamos a ir a la configuración de puntos del constructor. No entendí bien mi ortografía. Puntos de configuración. Bueno, eso no. Construye nuestra configuración. Y entonces la clave que estamos buscando es nuestra cadena de conexión de almacenamiento. Entonces ahora que tengo ese único lugar, puedo reutilizarlo en otro lugar. Así constructor punto añadir blob, cliente de servicio, y estoy pasando en ese valor de cadena de conexión. Bien, también puedo construir su hija tuvo que atender a los clientes y adivina qué? Toma la cadena de conexión y ¿adivina qué? También puedo añadir. Si dijiste mesa, entonces tienes toda la razón. Ahora vamos a entrar un poco en el cliente de servicio de cola. Si pasamos al servicio de cola, recuerda que cuando creamos un nuevo cliente, teníamos algunas opciones. Y esa sección de opciones incluía la codificación por defecto que queremos. Así que de vuelta en el program.cs, realidad podemos extender esta configuración agregando opciones de configuración de puntos al final de esta línea. Y luego vamos a crear un pequeño cuerpo de configuración. Solo estoy usando C como mi token lambda. Entonces dentro de esa sección de configuración, estoy configurando la codificación de mensajes de punto C es igual a la misma codificación base-64. Sepa que ya hemos hecho todo eso. Podemos inyectar en nuestros servicios existentes utilizando estos servicios en lugar de aprovisionarlos sobre la marcha. Entonces lo que podemos hacer es comenzar con el cliente de Blob Storage. Y lo que vamos a hacer es utilizar el servicio inyectado para conseguir un cliente de contenedores. Y no tenemos que llamar a este método cada vez. Entonces voy a inyectar el cliente de servicio blob en este constructor e inicializar un campo local. Ya sabemos cómo hacerlo. Y con eso inyectado, en realidad puedo, en vez de decir var container es igual a nuestro peso, obtener el cliente contenedor Blob. De hecho, puedo reemplazar esto con un cliente de servicio de blob dot get container client. Y esto no es un fregadero. Entonces es por eso que estamos recibiendo esa línea roja. ¿Bien? Y puedo pasar y reemplazar todas las instancias de ese método manual para simplemente estar usando nuestro cliente. Y entonces si quiero, puedo borrar este método. Lo que voy a dejar ahí para la posteridad para que podamos ver lo que solía ser. Contamos con los clientes de servicio de mesa que inyectamos e inicializamos. Y luego podemos reemplazar nuestra forma de conseguir mesa de cliente. Puedo saber solo llamar al cliente de servicio, obtener punto, obtener cliente de mesa. Y luego hacemos referencia al nombre de la tabla y solo al cartón que se está derramando. Ahí vamos. Así que ahora todas estas referencias, y esto es probablemente más similar a la inicialización de Blob Storage Client. Y sigue siendo el almacenamiento de la cola o la inicialización del cliente. Entonces eso está bien. Y por supuesto este método está aquí como referencia. Yo sí los pasé y reemplazé a todos, pero solo quería señalar que lo que no estamos haciendo aquí es crear si no existe. Entonces existe la posibilidad de que al obtener el cliente, pueda devolver nulo porque no existe. Entonces otro factor de operación podría haber sido que acabamos de eliminar esto y aún así devolvemos al cliente de servicio en base a esa llamada. Bien, así que aún podríamos retener el método call a esto y devolver al cliente por cada llamada, ¿verdad? O para cada método. Entonces depende de ti, ¿verdad? También podríamos haber definido un cliente de mesa arriba aquí, o un campo arriba arriba. Luego inicializamos el campo dentro de nuestro constructor, y luego solo usamos los campos. Entonces hay varias formas de hacerlo. Ahora en esa nota, voy a saltar nuevo al program.cs y vamos a ver otra forma abordar esto. Lo que estamos haciendo aquí es inyectar al cliente, al cliente de servicio. Y luego porque estamos inyectando el plan de servicio para tener que ir y crear una nueva instancia del cliente real que nos conecte con el recurso. Entonces, ¿y si quisiéramos simplemente registrar al cliente directo al recurso? Así que tendríamos que adoptar un enfoque ligeramente diferente con lo que estamos haciendo aquí solo. Y solo lo haré en otro anuncio como sección de tus clientes. Sólo para que podamos tener algún trato inicial. ¿Bien? Entonces digamos que quería el cliente de cola directamente, no el plan Queue Service, no el nombre del servicio, sino el cliente real. De hecho usaría el constructor punto add client. Entonces esto me permite especificar los tipos de datos. Entonces quiero las opciones de cola, cliente y Q. Y luego voy a inicializar un delegado usando marcadores de posición para los parámetros esperados para este método, si pasas el cursor sobre la planta AD, ves cuáles son los parámetros o bien representan. Y entonces vamos a usar una expresión lambda para nuestro cuerpo objeto. Y luego dentro de este método se esperaba que se devolviera una nueva instancia de cliente Q. Entonces eso significa que si salto a este servicio de colas donde hubiéramos estado inicializando a nuestros clientes. De hecho, podría usar este código aquí mismo y devolver un nuevo cliente que está usando la configuración o la cadena de conexión de almacenamiento. También podría poner el nombre de la cola en mi configuración. Así que no tengo que tenerlo codificado en el archivo. Entonces hagámoslo. De hecho, voy a crear una sección completamente nueva en la configuración y voy a llamarla como tu almacenamiento. Y ahí voy a poner la cadena de conexión. Y voy a simplemente quitarme la palabra el almacenamiento es algo redundante. Entonces ahora la llave y yo estoy haciendo lo mismo, al mismo tiempo porque no quiero olvidar. Entonces ahora la clave de la configuración para la cadena de conexión sería la cadena conexión de dos puntos de Azure Storage, ¿verdad? Porque ahora está en esa subsección. Y yo estoy haciendo todo esto, no. Entonces eso puso una coma ahí. Así que ahora puedo poner el nombre de la cola o varios nombres de cola, cualquiera que sea el nombre Q y voy a necesitar para mi aplicación. Puedo ponerlos aquí. Entonces el nombre de la cola va a ser, no me digas, ahí vamos. Yo también a eso. Ahí vamos. Entonces el nombre de la cola va a ser correos electrónicos del asistente hora y solo usaré el Almacenamiento de Blob. Acabo de poner las llaves de null y almacenamiento de mesa. Porque esta técnica se puede utilizar para los tres servicios de almacenamiento. Así que de vuelta en el program.cs, voy a hacer un ajuste rápido porque voy a necesitar los valores de configuración aquí. Entonces voy a cambiar esto de Builder a solo decir B. Y luego el nombre de la cola se va a cambiar la configuración del punto del constructor. Y luego podemos hacer referencia a eso como tu sección de almacenamiento y que la clave del nombre de la cola. ¿Bien? Y claro que tenemos que regresar. Por lo que esto necesita ser devuelto a los clientes UQ con todos esos valores. Ahora que tenemos este Q clientes registrados en el servicio de cola, puedo saber inyectar ese cliente Q directamente. No necesito esta referencia directa al nombre de la cola. Y puedo usar a este lindo cliente para hacer todas las comunicaciones en consecuencia. Entonces, ¿no necesito hacer eso en la inicialización dentro del mensaje de envío o dentro de este servicio en absoluto? No, puedo hacer algo similar para el Almacenamiento de Mesa. Simplemente puedo tomar este nombre de tabla y podemos ponerlo dentro de nuestra configuración de app json. Y luego en nuestro program.cs, sólo voy a copiar y pegar el cliente de cola en la misma sección. Y vamos a agregar un cliente para clientes de mesa con opciones de cliente de mesa. Y lo que estamos haciendo aquí es devolver una nueva instancia de cliente de tabla con una cadena de conexión de almacenamiento y nuestro nombre de Azure Storage Table, key o Table Storage. Mesa, Nombre de la mesa de almacenamiento, como sea que lo llames almacenamiento de mesa. ¿Bien? Así que ahora puedo inyectar este cliente de mesa directamente en el servicio de almacenamiento Table. Entonces, en lugar de inyectar al cliente del servicio, bueno, vamos a hacer ambas cosas. Entonces mesa cliente y yo voy a inicializar esto. Entonces estoy dejando todo este código aquí para que tengas referencia futura, ¿verdad? No es necesariamente que necesites todo esto y creo que ya lo sabemos. Pero no tengo que inicializar un cliente de mesa cada vez que solo puedo usar mi servicio inyectado, igual que lo que necesitábamos hacer con los clientes Q. Así que ahora solo puedo hacer mesa cliente a través de esta base de código. Entonces estas son solo algunas optimizaciones que puedes hacer a tu código para asegurarte de que, oh, bueno, no tengo que cambiar este. Entonces este método ahora sería archivado, por así decirlo, ¿verdad? Entonces estas son algunas optimizaciones y actividades de limpieza que puedes debido a eliminar algunas de estas referencias codificadas a la configuración. Y luego, por supuesto, discutimos el hecho de que probablemente no quieras almacenar todas estas claves dentro de la configuración de la aplicación. Así que en realidad podrías usar secretos. Y para usar secretos, solo tienes que hacer clic con el botón derecho en el archivo de imagen CSP y bajas para administrar los secretos de los usuarios. Y luego puedes agregar esa sección ahí. Por lo que no es de uno que se registre en el control de origen para uno, y no es inmediatamente visible a las miradas indiscretas, sino que sigue siendo accesible a través o configuración en nuestra startup. No hay razón por la que no estoy configurando un cliente blob mientras estoy cerrando. No voy a configurar nuestro cliente Blob. Porque recuerda que el cliente de Blob se crea directamente contra el Blob basado en la rodilla. Entonces, si bien esto es un poco más eficiente para simplemente seguir adelante e inyectar los carriles de servicio. Todavía necesitamos crear un cliente sobre la marcha basado en el blob que está a punto de procesarse. Porque una vez más, no sabemos qué blob se va a procesar para empezar con eso. Para que puedas seguir adelante y validar que son incentivos y estas nuevas inscripciones funcionan. Y sólo voy a comentar uno de ellos. Y eso es todo para esta actividad. Cerremos este módulo. 20. Conclusión: Así que hemos golpeado otra máscara, una y hemos completado este módulo como su almacenamiento. Durante la duración de este módulo, revisamos cómo crear y administrar una cuenta de almacenamiento. Esto nos implicó interactuar con Blob Table y Queue Storage Services, todo parte de esta oferta de cuentas de almacenamiento de Microsoft Azure. Analizamos cómo podemos usar el portal Azure o el navegador de almacenamiento que podríamos descargar tu computadora para interactuar con los diferentes servicios. Una vez más, Blob Table, Almacenamiento de cola. Entonces vimos que podíamos administrar los contenidos de esos, ya sea desde el portal Azure o localmente usando el navegador de almacenamiento. También analizamos cómo podemos desarrollar una solución dotnet Core para usar la cuenta de almacenamiento. Así que aquí mismo nos fijamos en almacenar y recuperar la cadena de conexión al almacenamiento o conos toda la provisión de fin de semana son y escribir código para interactuar con los diferentes servicios y el matiz está en el medio. Y en última instancia todos podemos platicar sobre el hecho de que cada uno de estos servicios se está gestionando a través de llamadas API RESTful y codificar. Todo lo que estamos haciendo es aprovisionar clientes HTTP para interactuar con los servicios subyacentes. También lo rematamos observando cómo podríamos facilitar la comunicación asincrónica usando colas. Y esto nos hizo implementar algo así como un patrón Pub Sub donde publicamos un mensaje a la cola. Y luego teníamos otra app que estaba suscrita a la cola que despegaría el mensaje, lo procesaría y seguiría adelante. Entonces ese es un ejemplo del patrón pops-up y cómo podemos implementar la comunicación asincrónica. Agradezco por acompañarme en este módulo. Te veré en la siguiente lección.