添加新包会破坏 .NET 5 应用程序
Adding new package breaks the .NET 5 application
我一直在努力弄清楚为什么我的控制台应用程序在我引入新包时立即失败。使用 IdentityModel.OidcClient
和 Microsoft.AspNetCore.Server.Kestrel
只有 有效,但是当添加 Microsoft.Extensions.Configuration.Json
时它会抛出异常。我也没有在代码中引用新包,我只是将它添加到项目中。
重现步骤:
克隆https://github.com/IdentityModel/IdentityModel.OidcClient.Samples.git
将 NetCoreConsoleClient 升级到 .NET 5(更新包)。
删除Serilog.Sinks.Literate过时的包。
在 Program.cs 中删除对 SeriLog 的 .WriteTo.LiterateConsole
调用并添加 using IdentityModel.Client
.
在SystemBrowser
class中为InvokeAsync
方法添加CancellationToken cancellationToken = new CancellationToken()
参数。 IBrowser
接口的签名已更改,新方法应如下所示:public async Task<BrowserResult> InvokeAsync(BrowserOptions options, CancellationToken cancellationToken = new CancellationToken())
运行 申请并使用 alice/alice 登录。获取token成功。
添加包Microsoft.Extensions.Configuration.Json
.
运行申请。它现在在写入 http 响应时抛出异常 Object reference not set to an instance of an object
。
写入响应时LoopbackHttpListener.SetResult
出现异常:ctx.Response.WriteAsync("<h1>You can now return to the application.</h1>");
为什么仅添加包 会对运行时产生如此大的影响?
项目文件:
<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
解决方案
摆脱 Microsoft.AspNetCore.Server.Kestrel
和 Microsoft.Extensions.Configuration.Json
,将 SDK 更改为 Microsoft.NET.Sdk.Web
,一切正常。感谢@JHBonarius 为我指明了正确的方向。
抛出异常
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);
}
...
我已经有两条评论了。
WriteAsync
是一个 async/Task。你需要等待它。
- 你的 'catch' 块在这种情况下也会抛出......你没有 'catch'...
无论如何,我认为问题在于您将新包的 .NET 5.0 版本添加到一个相当旧的项目中(请记住,包通常会引入它们所依赖的其他包)。尤其是 ASP.net 就没那么简单了。接口已更改。实例化方法已更改。你经常需要投入更多的工作。
将Microsoft.Extentions.Configuration.Json
的版本改回v3.1.13,问题好像没有了...
我的 ASP.NET Core 2.2 项目遇到了类似的问题。确保我没有任何大于 3 的 Microsoft.Extensions.X 包。1.X 为我解决了这个问题。
我遇到了完全相同的问题。
ctx.Response.StatusCode = 200;
ctx.Response.ContentType = "text/html";
ctx.Response.Headers.Add("Date", new DateTimeOffset.UtcNow.ToString());
await ctx.Response.WriteAsync(content);
await ctx.Response.Body.FlushAsync();
设置日期 Header 解决了它 4 我,因为那是什么失败 Kestrel.Core
我一直在努力弄清楚为什么我的控制台应用程序在我引入新包时立即失败。使用 IdentityModel.OidcClient
和 Microsoft.AspNetCore.Server.Kestrel
只有 有效,但是当添加 Microsoft.Extensions.Configuration.Json
时它会抛出异常。我也没有在代码中引用新包,我只是将它添加到项目中。
重现步骤:
克隆https://github.com/IdentityModel/IdentityModel.OidcClient.Samples.git
将 NetCoreConsoleClient 升级到 .NET 5(更新包)。
删除Serilog.Sinks.Literate过时的包。
在 Program.cs 中删除对 SeriLog 的
.WriteTo.LiterateConsole
调用并添加using IdentityModel.Client
.在
SystemBrowser
class中为InvokeAsync
方法添加CancellationToken cancellationToken = new CancellationToken()
参数。IBrowser
接口的签名已更改,新方法应如下所示:public async Task<BrowserResult> InvokeAsync(BrowserOptions options, CancellationToken cancellationToken = new CancellationToken())
运行 申请并使用 alice/alice 登录。获取token成功。
添加包
Microsoft.Extensions.Configuration.Json
.运行申请。它现在在写入 http 响应时抛出异常
Object reference not set to an instance of an object
。
写入响应时LoopbackHttpListener.SetResult
出现异常:ctx.Response.WriteAsync("<h1>You can now return to the application.</h1>");
为什么仅添加包 会对运行时产生如此大的影响?
项目文件:
<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
解决方案
摆脱 Microsoft.AspNetCore.Server.Kestrel
和 Microsoft.Extensions.Configuration.Json
,将 SDK 更改为 Microsoft.NET.Sdk.Web
,一切正常。感谢@JHBonarius 为我指明了正确的方向。
抛出异常
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);
}
...
我已经有两条评论了。
WriteAsync
是一个 async/Task。你需要等待它。- 你的 'catch' 块在这种情况下也会抛出......你没有 'catch'...
无论如何,我认为问题在于您将新包的 .NET 5.0 版本添加到一个相当旧的项目中(请记住,包通常会引入它们所依赖的其他包)。尤其是 ASP.net 就没那么简单了。接口已更改。实例化方法已更改。你经常需要投入更多的工作。
将Microsoft.Extentions.Configuration.Json
的版本改回v3.1.13,问题好像没有了...
我的 ASP.NET Core 2.2 项目遇到了类似的问题。确保我没有任何大于 3 的 Microsoft.Extensions.X 包。1.X 为我解决了这个问题。
我遇到了完全相同的问题。
ctx.Response.StatusCode = 200;
ctx.Response.ContentType = "text/html";
ctx.Response.Headers.Add("Date", new DateTimeOffset.UtcNow.ToString());
await ctx.Response.WriteAsync(content);
await ctx.Response.Body.FlushAsync();
设置日期 Header 解决了它 4 我,因为那是什么失败 Kestrel.Core