c# - Agregar un nuevo paquete rompe la aplicación .NET 5

CorePress2024-01-24  8

He estado tratando de descubrir por qué mi aplicación de consola falla en el instante en que introduzco un nuevo paquete. El uso de IdentityModel.OidcClient y Microsoft.AspNetCore.Server.Kestrel solo funciona, pero al agregar Microsoft.Extensions.Configuration.Json genera una excepción. Tampoco hago referencia al nuevo paquete en el código, simplemente lo agrego al proyecto.

Pasos para reproducir:

Clonar https://github.com/IdentityModel/IdentityModel.OidcClient.Samples.git

Actualice NetCoreConsoleClient a .NET 5 (paquetes de actualización).

Eliminar el paquete obsoleto Serilog.Sinks.Literate.

Elimine la llamada a .WriteTo.LiterateConsole para SeriLog en Program.cs y agréguela usando IdentityModel.Client.

Agregar CancellationToken cancellationToken = nuevo parámetro CancellationToken() para InvokMétodo eAsync en la clase SystemBrowser. La firma de la interfaz IBrowser ha cambiado, el nuevo método debería verse así: public async Task<BrowserResult> InvokeAsync(opciones de BrowserOptions, CancellationToken cancellationToken = new CancellationToken())

Ejecute la aplicación e inicie sesión con alice/alice. La adquisición del token se realizó correctamente.

Agregar paquete Microsoft.Extensions.Configuration.Json.

Ejecutar la aplicación. Ahora arroja una excepción. La referencia de objeto no está configurada como una instancia de un objeto al escribir en la respuesta http.

La excepción ocurre en LoopbackHttpListener.SetResult al escribir en la respuesta: ctx.Response.WriteAsync("<h1>Ahora puede regresar a la aplicación.</h1>");

¿Por qué agregar solo un paquete tiene tal impacto?al tiempo de ejecución?

Archivo de proyecto:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net5.0</TargetFramework>
    <AssemblyName>NetCoreConsoleClient</AssemblyName>
    <OutputType>Exe</OutputType>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="5.0.0" />
    <PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" />
    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.2.0" />
    <PackageReference Include="IdentityModel.OidcClient" Version="3.1.2" />
  </ItemGroup>

</Project>

Excepción completa:

System.NullReferenceException
  HResult=0x80004003
  Message=Object reference not set to an instance of an object.
  Source=Microsoft.AspNetCore.Server.Kestrel.Core
  StackTrace:
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.CreateResponseHeader(Boolean appCompleted)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProduceStart(Boolean appCompleted)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.InitializeResponseAsync(Int32 firstWriteByteCount)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.WriteAsync(ReadOnlyMemory`1 data, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpResponseStream.WriteAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Http.HttpResponseWritingExtensions.WriteAsync(HttpResponse response, String text, Encoding encoding, CancellationToken cancellationToken)
   at Microsoft.AspNetCore.Http.HttpResponseWritingExtensions.WriteAsync(HttpResponse response, String text, CancellationToken cancellationToken)
   at ConsoleClientWithBrowser.LoopbackHttpListener.SetResult(String value, HttpContext ctx) in C:\Users\stefa\Source\Repos\IdentityModel.OidcClient.Samples\NetCoreConsoleClient\src\NetCoreConsoleClient\SystemBrowser.cs:line 172
Solución

Deshágase de Microsoft.AspNetCore.Server.Kestrel y Microsoft.Extensions.Configuration.Json, cambie el SDK a Microsoft.NET.Sdk.Web y todo funcionará. Gracias a @JHBonarius por indicarme la dirección correcta.

Proporcione más detalles sobre el paso 5. Parece que está declarando una variable local, pero dice que está agregando un parámetro... ¿Y qué arroja exactamente?

- JH Bonarius

27 de marzo de 2021 a las 9:46

Tenga en cuenta que la causa también podría ser simplemente actualizar las versiones principales de los paquetes Y actualizar el núcleo 2.0 a 5.0 Y eliminar los paquetes, sin realizar modificaciones en el código. Ése es un riesgo importante de comportamiento inestable.

- JH Bonarius

27/03/2021 a las 9:50

Se requieren más modificaciones. Necesita agregar usando IdentityModel.Cliente; a Program.cs y es necesario eliminar .WriteTo.LiterateConsole(outputTemplate:... de Program.cs.

- JH Bonarius

27 de marzo de 2021 a las 9:58

@JHBonarius, agregué más contexto y también probé esto sin actualizar el repositorio, sino iniciando un nuevo proyecto y simplemente copiando el código relevante. Usando paquetes correctos.

Vicente

27/03/2021 a las 10:44

Agregue la excepción que se genera.

-Polígnomo

27/03/2021 a las 10:47



------------------------------------

Tuve exactamente el mismo problema.

 ctx.Response.StatusCode = 200;
 ctx.Response.ContentType = "text/html";
 ctx.Response.Headers.Add("Date", DateTimeOffset.UtcNow.ToString());
 await ctx.Response.WriteAsync(content);
 await ctx.Response.Body.FlushAsync();

Configurar el encabezado de fecha me lo solucionó, ya que eso es lo que está fallando en Kestrel.Core

2

1

Sí, agregar la "Fecha" valor en el encabezado resolverlo hice. Gracias. Aunque tengo que sacar lo nuevo de DateTimeOffset.ctx.Response.Headers.Add("Date", DateTimeOffset.UtcNow.ToString());

- Musa Biralo

4 de abril de 2022 a las 8:11

1

¡Sorprendentemente, simplemente funciona! Sugiera marcarlo como respuesta.

- Joe Lau

14 de junio de 2022 a las 10:09



------------------------------------

Se lanza la excepción

private void SetResult(string value, HttpContext ctx)
{
    try
    {
        ctx.Response.StatusCode = 200;
        ctx.Response.ContentType = "text/html";
        // below
        ctx.Response.WriteAsync("<h1>You can now return to the application.</h1>"); <--- here
        // ^^
        ctx.Response.Body.Flush();

        _source.TrySetResult(value);
    }
...

Ya tengo dos comentarios.

WriteAsync es una tarea asíncrona. Tienes que esperarlo. tu bloque 'captura' también se lanzará en este caso... no tienes 'captura' para eso...

De todos modos, creo que el problema es que agregas una versión .NET 5.0 del nuevo paquete (y recuerda que los paquetes a menudo incorporan otros paquetes de los que dependen) a un proyecto bastante antiguo. Especialmente con ASP.net no es tan sencillo. Las interfaces han cambiado. Los métodos de creación de instancias han cambiado. A menudo necesitas esforzarte más.

Cambie la versión de Microsoft.Extentions.Configuration.Json nuevamente a v3.1.13 y el problema parece haber desaparecido...

3

El código se clonó del repositorio de IdentityModel. Agregué async/await a mi código original. Me pregunto por qué simplemente agregar el paquete podría tener tal impacto en las otras asambleas. Tenía la impresión de que .NET 5 solucionaba el infierno de DLL experimentado anteriormente en .Net Framework. Echaré un vistazo más profundo a los archivos reales en la carpeta bin.

Vicente

27/03/2021 a las 11:15

@Vincent no, eso ya está con .NET Core. Y "DLL-infierno" es otra cosa entoncesqué estás haciendo. Está actualizando de .NET core 2.0 a .NET 5.0: no es una tarea trivial. Muchas cosas cambian con una actualización de versión tan importante. Las cosas * podrían * funcionar, pero podrían romperse en cualquier momento. (En mi empresa también estamos intentando actualizar proyectos a .NET 5.0, pero son semanas y semanas de trabajo).

- JH Bonarius

27/03/2021 a las 11:21

Estaba seguro de que NetStandard era suficiente para la compatibilidad con Net 5. Intentaré reescribir.

Vicente

27/03/2021 a las 12:42



------------------------------------

Estaba teniendo un problema similar con mi proyecto ASP.NET Core 2.2. Asegurarme de que no tenía ningún paquete Microsoft.Extensions.X superior a 3.1.X solucionó el problema.

Compartir mejorar esta respuesta Seguir Respondido

13 de agosto de 2021 a las 16:51

digresión_lineal

digresión_lineal

1

1

Puede ser, pero en realidad no responde a la pregunta ya que se trata específicamente de .NET 5.0. Obviamente, eliminar las versiones actuales de la biblioteca no les solucionará el problema.

- Jeremy Caney

13/08/2021 a las 18:24

randomThread
¿Cómo devolver los elementos alrededor de otro elemento en una lista de Python?Python - Cómo regresar relativo a la solicitud de Djangocómo obtener el contenido entre paréntesis en un archivo Python¿Cómo crear una orden de compra usando la API de Binance en Python usando todas mis monedas seleccionadas en lugar de establecerhtml: uso de consulta de medios para ejecutar