martes, 15 de marzo de 2022

Novedades (a marzo de 2022)

 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:


What is .NET MAUI?

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?

lunes, 7 de marzo de 2022

HTTP Error 500.30 - ANCM In-Process Start Failure al intentar lanzar el debugger (Visual Studio 2019)

 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:



HttpClient en Asp.Net MVC 5


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 cargaSingleton 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.


martes, 7 de septiembre de 2021

CORS (Cross-Origin Resource Sharing) - Lecciones aprendidas

Estas son algunas lecciones aprendidas luego de haber tenido algunos problemas para implementar nuestras aplicaciones SPA (Angular - REST API) en nuestros servidores.

 ¿Qué es CORS?

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.




viernes, 20 de agosto de 2021

Patrón CQRS - Command and Query Responsibility Segregation

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:

- What is the CQRS pattern?

- CQRS Journey

- CQRS Journey - Introducing the Command Query Responsibility Segregation Pattern