Nuget包与ASP.NET核心应用程序

时间:2017-02-07 00:11:01

标签: asp.net dll asp.net-core nuget-package asp.net-core-middleware

背景

我试图编写一些中间件来使用ASP.NET Core进行自定义身份验证。因为我依赖于使用.NET框架的一些专有代码,所以我使用ASP.NET Core的.Net Framework版本而不是ASP.NET Core的.NET Core版本。

最初,我将中间件直接构建到ASP.NET Core应用程序中,并使用Nuget安装了我的专有依赖项。这很好用。

接下来,我想构建一个Nuget包,以便我的中间件可以由几个ASP.NET Core Web服务在内部共享。所以我创建了一个类库并添加了中间件代码。我安装了各种ASP.NET Core Nuget Packages和我的专有Nuget包来解决依赖关系并构建Nuget包。我成功地将它安装在ASP.NET Core应用程序中。

问题

当我尝试运行中间件时,我得到以下内容:Could not load file or assembly 'System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

ASP.NET Core应用程序似乎使用System.Net.Http 4.0.0

尝试1

当然,我查看了类库中的System.Net.Http依赖项。它在Nuget包中下拉,适当地命名为System.Net.Http。我成功地将该软件包安装到ASP.NET Core应用程序(或者它告诉我)。我运行了应用程序,中间件失败了同样的错误。很困惑,我回去看了看Nuget的包裹。 System.Net.Http失踪了!我再次安装了#34;成功",但再次搜索包显示它没有安装。

我禁用了自动包恢复,我清除了Nuget缓存,然后再次尝试。没运气。该软件包认为它已成功安装,但它从未真正起作用。

这是ASP.NET核心应用程序项目的相关部分.json:

{
  "dependencies": {
    "ProprietaryLibrary": "1.0",
    "Microsoft.AspNetCore.Authentication": "1.1.0",
    "Microsoft.AspNetCore.Mvc": "1.1.1",
    "Microsoft.AspNetCore.Routing": "1.1.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.1.0",
    "Microsoft.Extensions.Configuration.Json": "1.1.0",
    "Microsoft.Extensions.Logging": "1.1.0",
    "Microsoft.Extensions.Logging.Console": "1.1.0",
    "Microsoft.Extensions.Logging.Debug": "1.1.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
    "MyMiddlewarePackage": "1.0.0",
    "ProprietaryDependency": "1.0.0",
    "ProprietaryDependency": "1.0.0",
    "System.Net.Http": "4.0.0" <--- This updates to 4.1.0 if I install that nuget package, but nothing really happens.
  },

  "frameworks": {
    "net461": { }
  }
}

尝试2

我想到我可能错误地设置了类库。所以我去了https://github.com/aspnet/Security并复制了他们中间件的项目结构。我再次安装了我的依赖项(一个小得多的列表!),并且它已成功构建。我再次构建了一个Nuget包并将其安装到ASP.NET Core应用程序中。但同样,我对版本4.1.1.0也有同样的错误。

这是新类库的project.json:

{
  "dependencies": {
    "Microsoft.AspNetCore.Authentication": "1.0.0",
    "Microsoft.Extensions.Caching.Memory": "1.0.0",
    "Microsoft.Extensions.Options": "1.0.0",
    "Microsoft.Extensions.WebEncoders": "1.0.0"
  },

  "frameworks": {
    "net461": {
      "dependencies": {
        "ProprietaryLibrary": "1.0.0"
      }
    }
  }
}

根本没有引用System.Net.Http

如果您对该专有库感到好奇,请参阅参考树。所有被清空的东西都是专有的DLL。所以我也没有看到任何System.Net.Http引用。我不是说它不存在,但我无法看到它。即使它存在,为什么专有的库可以直接嵌入到ASP.NET Core应用程序中?

Proprietary Library Dependency tree

摘要

我无法确定引用System.Net.Http 4.1.1.0的位置,并且我无法使ASP.NET Core更新使用比4.0.0.0更新的内容。但是,如果我粘贴我的代码并直接在ASP.NET Core应用程序中下载依赖项,那么一切正常。

有什么想法吗?

更新

看起来问题是Microsoft.AspNetCore.Authentication Nuget包。每次安装时,它都会核对System.Net.Http的新版本。关于如何预防的任何想法?

1 个答案:

答案 0 :(得分:0)

好吧,我明白了。这是问题所在的包Microsoft.AspNetCore.Authentication

缩小范围后,看起来微软已经意识到了这个问题:https://github.com/aspnet/Security/issues/1046。他们会在一个月内发布修复,听起来像是。

以下是修复它的提交:https://github.com/aspnet/Security/commit/0f429324c54e380eeed235fea2bdfabb3639f43e