使用Nuget包Owin.Security.Providers.OpenIDBase 2.1.1
和Owin.Security.Provides.OpenID 2.24.0
-DLL版本2.0.0.0
。
我正在派生我自己的提供者,即MyOwnAuthenticationMiddleware : OpenIDAuthenticationMiddlewareBase<MyOwnAuthenticationOptions>
,并将其作为标准启动的一部分传递给IAppBuilder.Use()
。
这在我自己的机器上编译和运行得很好——这是经典的开发人员行。
但当在Microsoft Visual Studio Online的构建服务器(Hosted 2017(上构建时,它会进行构建,但在启动时会抛出运行时错误:
MissingFieldException: Field not found:
'Owin.Security.Providers.OpenIDBase.OpenIDAuthenticationMiddlewareBase`1.HTTPClient'.]
xxxx.CreateSpecificHandler()
字段HTTPClient
(一个System.Net.Http.HttpClient
(显然在派生的泛型类中找不到——它是OpenIDAuthenticationMiddlewareBase
的成员,在生活记忆中没有改变。
我认为构建服务器必须链接到不同的OpenIDAuthenticationMiddlewareBase
,但错误消息中的完整规范名称表明情况并非如此。
由于正在进行的.NET Framework/.NET标准DLL地狱,我收到了一些警告,其中一个警告与System.Net.Http
的不同版本有关,我也将其作为Nuget包。这是否相关?
另一方面,有没有人觉得Nuget依赖项和令人困惑的.NET Framework/Standard/Core版本控制的组合刚刚重新创建了.NET最初应该缓解的DLL地狱?
问题与System.Net.Http和.NETStandard.有关
如果您有一个针对.NET Framework 4.6/4.7的解决方案/项目,其中涉及到引用.NETStandard2,那么您可能会遇到麻烦。在Github上查看此处和此处的问题。关键词:.NET Standard,.NET Framework,ASP.NET,System.NET.Http,MissingMethodException,FieldNotFoundException。
症状:运行时异常,如FieldNotFoundException
,其中有问题的字段可能是HttpClient,例如System.Net.Http
包中的某个字段。或者(在我的情况下,在BotFramework的情况下(-对api/messages
的请求,试图与机器人对话的用户会以MissingMethodException
失败。您只能在服务器日志或ApplicationInsights中看到。从用户的POV来看,它会无声地失败。
共识似乎是,在这种情况下需要明确提及System.Net.Http
。最简单的方法是将绑定重定向添加到web.config中,例如,对于NugetSystem.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>
,错误地认为让系统处理绑定重定向是最好的——请参阅本文。然而,我错过了它(清楚地(说自动生成的绑定重定向在web应用程序项目中不起作用的地方!