我一直试图找出为什么我的控制台应用程序在引入新包后立即失败。使用IdentityModel.OidcClient
and Microsoft.AspNetCore.Server.Kestrel
only有效,但是添加时Microsoft.Extensions.Configuration.Json
它抛出异常。我也不在代码中引用新包,我只是将其添加到项目中。
重现步骤:
-
Clone https://github.com/IdentityModel/IdentityModel.OidcClient.Samples.git https://github.com/IdentityModel/IdentityModel.OidcClient.Samples.git
-
Upgrade NetCore控制台客户端到 .NET 5(更新包)。
-
Remove Serilog.Sinks.Literate过时的包。
-
删除呼叫.WriteTo.LiterateConsole
对于 Program.cs 中的 SeriLog 并添加using IdentityModel.Client
.
-
Add CancellationToken cancellationToken = new CancellationToken()
参数为InvokeAsync
中的方法SystemBrowser
班级。签名为IBrowser
接口已更改,新方法应如下所示:public async Task<BrowserResult> InvokeAsync(BrowserOptions options, CancellationToken cancellationToken = new CancellationToken())
-
运行应用程序并使用 alice/alice 登录。获取token成功。
-
添加包Microsoft.Extensions.Configuration.Json
.
-
运行应用程序。它现在抛出异常Object reference not set to an instance of an object
当写入http响应时。
异常发生在LoopbackHttpListener.SetResult
写回复时:ctx.Response.WriteAsync("<h1>You can now return to the application.</h1>");
为什么添加包only,对运行时间有这么大的影响吗?
项目文件:
<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>
完整异常:
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
Solution
摆脱Microsoft.AspNetCore.Server.Kestrel
and Microsoft.Extensions.Configuration.Json
,将SDK更改为Microsoft.NET.Sdk.Web
一切正常。感谢@JHBonarius 为我指明了正确的方向。