Connect an on-premises network to a Microsoft Azure virtual network
Connect your on premises network to Azure with VPN Gateway
Connecting On-premises Networks with Azure Virtual Networks
La siguiente es una lista de temas nuevos (o no tanto) y no tan conocidos aún por nosotros a la fecha y que conviene tenerlos presentes:
Sucesor de Xamarin, MAUI es un framework cross-platform (Multi-platform App UI) para crear apps desktop y mobile con C# y XAML.
Duende - IdentityServer (*)
The most flexible and standards-compliant OpenID Connect and OAuth 2.0 framework for ASP.NET Core.
OAuth 2.0, OpenID Connect y JSON Web Tokens (JWT) ¿Que es qué?
El artículo describe para qué es cada cosa y cuando utilizarlos.
ASP.NET Core Identity (*)
- Is an API that supports user interface (UI) login functionality.
- Manages users, passwords, profile data, roles, claims, tokens, email confirmation, and more.
The Microsoft identity platform helps you build applications your users and customers can sign in to using their Microsoft identities or social accounts, and provide authorized access to your own APIs or Microsoft APIs like Microsoft Graph
Microsoft identity platform (NO relacionado con ASP.Net Core Identity)
The Microsoft identity platform for developers is an authentication service, open-source libraries, and application management tools.
NOTA:
(*) Al momento de escribir esta entrada tenemos la siguiente duda: para desarrollar una aplicación web (SPA c/Angular) desde cero seguramente utilizaremos ASP.NET core Identity. Deberíamos además implementar IdentiryServer?
Fix .NET Core HTTP Error 500.30 After Publish to App Service from Visual Studio
En el Log del sistema se genera un error:
Application '/LM/W3SVC/2/ROOT' with physical root 'C:\_sistemas\cesvi_analytics\Analytics_WebApi\Analytics_WebApi.API\' failed to load coreclr
SOLUCION:
Cambiar "InProcess" por "OutOfProcess" en la configuración del Debug:
El inconveniente de utilizar muchas instancias de HttpClient (dentro de un USING) es que finalmente produce errores de tipo "socket exhaustion".
The Problem with using HttpClient as opposed to IHttpClientFactory
The problem associated with using many instance of HttpClient in our app doesn’t come from HttpClient itself. But it comes from HttpMessageHandler and it’s lifetime. When we new up many instances of HttpClient in our app with a using statement, what happen is the HttpClient is disposed of but the socket stays open. This can lead to socket exhaustion problem, you can read more about this issue here.
Using IHttpClientFactory with Asp.Net MVC 5
Para solucionar esto en Asp.Net Core se puede utilizar HttpClientFactory.
Pero como HttpClientFactory fue inicialmente desarrollado para .Net Core, su implementación en el .Net Framework se torna difícil y optamos por simplemente utilizar un objeto HttpClient estático, como mensiona aquí: YOU'RE USING HTTPCLIENT WRONG AND IT IS DESTABILIZING YOUR SOFTWARE
Pero la implementación con el HttpClient estático (Singleton) tiene problemas en un escenario de balenceo de carga: Singleton HttpClient doesn't respect DNS changes
Singleton HttpClient? Beware of this serious behaviour and how to fix it.
CONCLUSIÓN:
No es recomendable utilizar múltiples instancias de HttpClient en Asp.Net por el problema de socket exhaustion. Lo ideal es implementar IHttpClientFactory, pero como fue desarrollado para .Net Core su implementación en nuestro sistema ASP.Net MVC 5 no es viable (Dependency Injection).
Una solución de compromiso sería utilizar HttpClient estático pero el sistema no quedaría apto para balanceo de carga.
La solución óptima sería entonces crear un nuevo proyecto .Net Core con microservicios para resolver las llamadas a APIs externas.
Partimos de
The Polly Project - https://github.com/App-vNext/Polly
Using Polly (! the parrot) in .NET
POLLY, UNA LIBRERÍA DE PATRONES DE RESILIENCIA PARA .NET
Create a simple Retry Policy by using Polly in any fault.
Para poder implementar Polly, sería necesario utilizar IHttpClientFactory.
En .NET Framework se implementa de la siguiente manera:
https://hamidmosalla.com/2020/05/22/using-ihttpclientfactory-with-asp-net-mvc5/
Luego, se aplica el Polly siguiendo estos pasos:
https://www.c-sharpcorner.com/article/using-retry-pattern-in-asp-net-core-via-polly/
Sin embargo, lo anterior aplica muy bien para .Net Core pero se complica la implementación en .Net Framework 4.0. Nuestra solución "de compromiso" final fue la siguiente:
- Using Polly (! the parrot) in .NET
Polly Call async
https://www.asptricks.net/2019/06/create-simple-retry-policy-by-using.html
HttpClient estático
https://www.aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
Estas son algunas lecciones aprendidas luego de haber tenido algunos problemas para implementar nuestras aplicaciones SPA (Angular - REST API) en nuestros servidores.
Hay dos caminos al momento de habilitar CORS para un sitio web.
1 - A través de un Middleware dentro de la aplicación. Es conveniente hacerlo cuando no se tiene control sobre el servidor donde estará alojada la aplicación. En ese caso es la propia aplicación la que implementa el middleware que administra CORS.
Enable Cross-Origin Requests (CORS) in ASP.NET Core
2 - Configurando el servidor web (IIS). Hay que verificar que esté instalado el módulo general "CORS" y luego especificar los parámetros para cada sitio en el web.config. Esta es una opción mejor a la anterior porque permite modificar la configuración sin tocar el código pero requiere instalar el módulo general de CORS en el servidor.
IIS CORS module Configuration Reference
Aprendiendo de nuestros errores:
- No sirve configurar HEADERS (de tipo "access-control-allow-origin") porque no funciona bien el "preflight".
- Por algún motivo en nuestro IIS dejó de funcionar el middleware del asp.net y tuvimos que configurar los sitios a través del web.config. Habría que probar desinstalando el CORS del servidor, tal vez así vuelve a funcionar el middleware.
Luego de haber transitado por el curso "Microservicios con ASP.NET 5, Angular, MongoDB, Docker" me quedó la idea de implementarlo en nuevos proyectos.
Analizando el tema en más profundidad entiendo que se trata de un recurso aplicable a algunos casos en particular y no como estándar de arquitectura global.
Su implementación requiere esfuerzo adicional y se deberá evaluar la relación costo/beneficio en cada caso.
Referencias:
- CQRS Journey - Introducing the Command Query Responsibility Segregation Pattern