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.