使用 Azure SignalR 时,无法加载 Microsoft.Extensions.Logging.Abstractions

When using Azure SignalR, cannot load Microsoft.Extensions.Logging.Abstractions

我正在使用 Asp.Net MVC5 并尝试在我们的 Azure 数据库上实现具有 SQL 依赖性的 Azure SignalR。我能够 运行 我们的应用程序就好了,我以前也有本地托管的 SignalR,但是当我尝试使用 Azure SignalR 并添加:

    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            //starting azure signalR
            app.MapAzureSignalR(this.GetType().FullName);
        }
    }

对于我的 Startup.cs class,以及 web.config 中必要的连接字符串,我收到此错误:

Could not load file or assembly 'Microsoft.Extensions.Logging.Abstractions, Version=1.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

我尝试卸载并重新安装 Azure SignalR NuGet 包,我尝试确保解决方案中的版本匹配(有 10 个项目),我删除了 bin 和 obj 文件夹,我确保 packages.config 和 .csproj 文件匹配正确的版本。在某些时候它要求 Version=2.1.0.0,在切换回该版本后,它会针对 Microsoft.Aspnetcore 或 Logging.Abstractions V1 再次发出另一个错误。

我真的不知道从哪里开始,我在 .net mvc5 中下载了一个 Azure SignalR 示例并且能够正常工作,但由于某种原因它在这么大的环境中不起作用解决方案。我是一般的开发新手,所以任何帮助将不胜感激。

更新: 听取有关下一步操作的建议,我在 Web.config 中为 Microsoft.Extensions.Logging.Abstractions 添加了一个 bindingRedirect。这清除了错误,但为 .Logging 提供了相同的错误。为此添加了一个 bindingRedirect,并为 Microsoft.Extensions.Options 得到了相同的错误,做了同样的事情并修复了。但是现在我得到这个错误:

Could not load file or assembly 'System.Memory, Version=4.0.1.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51' or one of its dependencies. The system cannot find the file specified.

即使添加了这个 bindingRedirect,我仍然得到同样的错误:

  <dependentAssembly>
        <assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-4.5.3.0" newVersion="4.5.3.0" />
  </dependentAssembly>

我卸载并重新安装了 System.Memory nuget,检查了 packages.config、web.config 和 .csproj 文件,它们都匹配相同的版本。

正如 mxmissile 所指出的,这将是不同包请求的不同版本之间的冲突。正如您所指出的,SignalR 包本身运行良好,因此这不是该包的具体问题。

事实上有多个项目也不重要 - 包是在每个项目的基础上安装的,尽管 ASP.NET 将在版本匹配的情况下重用它们。我不会说这不可能发生,但它不应该基于它的工作原理。

如果没有安装的软件包和版本的完整列表,这几乎不可能由其他人重现,但是有几件事要做,试图找出冲突。

  1. 检查 Web.Config 中的库列表。应该有类似 <bindingRedirect oldVersion="0.0.0.0-3.1.1.0" newVersion="3.1.1.0" /> for Microsoft.Extensions.Logging.Abstractions 的东西,其中 3.1.1.0 是当前安装的版本。如果关闭,通常 uninstalling/reinstalling 会清除它。无法重现问题,我不能肯定地说,但检查以确保这是正确的可以解决问题。我过去也遇到过删除 bindingredirect 属性 完全解决冲突的情况。
  2. 第二件事有点乏味,但应该准确地指出问题所在。以您目前只有 SignalR 的项目为例,开始一个一个地添加另一个项目中包含的 Nuget 包,每次都测试构建。一旦构建失败,您就会知道冲突在哪里,并可以着手解决它。
  3. bindingredirect 属性 的存在是为了防止此类问题,但如果没有其他办法, dependantAssembly 列表中的 the codeBase property 可以让您直接CLR 包含给定程序集的多个版本。这使得项目更难维护,因为如果版本要求发生变化,您将需要手动更新此清单。