Owin.Security.Providers - 派生的 OpenIDAuthenticationMiddlewareBase class 声明了 FieldNotFoundException

Owin.Security.Providers - OpenIDAuthenticationMiddlewareBase derived class claims a FieldNotFoundException

使用 Nuget 包 Owin.Security.Providers.OpenIDBase 2.1.1Owin.Security.Provides.OpenID 2.24.0 - DLL 版本 2.0.0.0

我正在派生自己的提供程序 - 即 MyOwnAuthenticationMiddleware : OpenIDAuthenticationMiddlewareBase<MyOwnAuthenticationOptions>,并将其作为标准 Startup 的一部分传递给 IAppBuilder.Use()

这在我自己的机器上编译和运行良好 - classic 开发者系列。

但是当基于 Microsoft Visual Studio Online 的构建服务器(2017 年托管)构建时,它会构建但在启动时抛出运行时错误:

MissingFieldException: Field not found:
    'Owin.Security.Providers.OpenIDBase.OpenIDAuthenticationMiddlewareBase`1.HTTPClient'.]
    xxxx.CreateSpecificHandler()

字段 HTTPClient (a System.Net.Http.HttpClient) 显然无法在派生泛型 class 中找到 - 它是 OpenIDAuthenticationMiddlewareBase 的成员,它没有改变在人们的记忆中。

我认为构建服务器必须链接到不同的 OpenIDAuthenticationMiddlewareBase,但错误消息中的完整规范名称表明并非如此。

由于正在进行的 .NET Framework/.NET Standard DLL 地狱,我收到了相当多的警告 - 一个与 System.Net.Http 的不同版本有关,我也将其作为 Nuget 包。这可能相关吗?

一个不相关的说明 - 是否有人觉得 Nuget 依赖项和令人眼花缭乱的 .NET 数组的组合 Framework/Standard/Core 版本控制刚刚重新创建了 .NET 应该在第一个中缓解的相同 DLL 地狱地点?

问题出在 System.Net.Http 和 .NETStandard。

如果您有一个 solution/project 目标 .NET Framework 4.6/4.7 涉及引用 .NETStandard2,您可能会遇到麻烦。请参阅 Github 上的问题 here and here。关键字:.NET Standard、.NET Framework、ASP.NET、System.Net.Http、MissingMethodException、FieldNotFoundException。

症状:运行时异常 - 例如 FieldNotFoundException,其中有问题的字段可能是 HttpClient,例如来自 System.Net.Http 包的东西。或者(在我的情况下,在 BotFramework 的情况下)- 请求 api/messages,尝试与机器人交谈的用户失败并显示 MissingMethodException。您只能在服务器日志或 ApplicationInsights 中看到。从用户的角度来看,它默默地失败了。

共识似乎是在这些情况下需要明确引用 System.Net.Http。最简单的方法是将绑定重定向添加到您的 web.config - 例如,对于 Nuget System.Net.Http 包版本 4.3.3:

  <dependentAssembly>
    <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
  </dependentAssembly>

最初不存在的原因是我的 .csproj 文件中有 <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>,错误地认为让系统处理绑定重定向是最好的 - 请参阅文章here。但是,我错过了它(清楚地)说自动生成的绑定重定向在 Web 应用程序项目中不起作用的地方!