【问题标题】:Why does adding a dependency in my Web API (ASP.NET v5) project not work fully?为什么在我的 Web API (ASP.NET v5) 项目中添加依赖项不能完全正常工作?
【发布时间】:2015-05-07 08:11:02
【问题描述】:

我在 Windows 8.1 上使用 Visual Studio 2015 CTP 6。

我正在尝试使用 ASP.NET v5 及其新的项目文件格式编写 Web API。我已在我的project.json 文件中添加了对 Noda Time v1.3.0 的引用,Visual Studio 中的编辑器将其选中,但构建过程失败。

从头开始复制配方:

  • 打开 VS 2015 CTP 6
  • 在新解决方案中创建新项目:
    • 选择 ASP.NET Web 应用程序项目模板
    • 在模板对话框中选择“ASP.NET 5 Preview Web API”
  • 构建项目,只是为了确认一切正确
  • 打开project.json,在(格式错误的)“依赖项”部分中,在开头添加一行(以避免在另一行中添加逗号):

    "NodaTime": "1.3.0",
    
  • 打开Controllers\ValuesController.cs
  • 编辑无参数的Get() 方法,使主体为:

    return DateTimeZoneProviders.Tzdb.Ids;
    
    • DateTimeZoneProviders 会有红色曲线,这是合理的 - 我们还没有 using 指令。
  • 将光标放在DateTimeZoneProviders 并点击Ctrl+. - 你应该被提供“using NodaTime;”作为潜在的修复......所以Intellisense(和因此 Roslyn) 肯定知道依赖关系。
  • 接受修复。曲线会消失 - 一切都很好,对吧?
  • 尝试构建解决方案:你应该得到两个错误,基本上表明依赖关系还没有被解决。

在资源管理器中,如果你查看BugDemo 解决方案目录,你会发现一个artifacts\obj\BugDemo\Debug\ProjectRawReferences 目录包含“ASP.NET Core 5.0”和“ASP.NET 5.0”目录,这两个目录都有很多DLLs 在......但不是 Noda Time。

右键单击项目并选择“恢复包”并不能解决此问题。

当我使用 Project K 构建同一个项目时,kpm restore 确实选择了 Noda Time,如果您向project.json 添加一个部分,如下所示,那么k web 工作并访问http://localhost:5001/api/values 将显示所有 TZDB 时区 ID:

"commands": {
  "web": "Microsoft.AspNet.Hosting --server Microsoft.AspNet.Server.WebListener --server.urls http://localhost:5001"
},

那么,我做错了什么?还是只是一个错误?

【问题讨论】:

    标签: c# asp.net-web-api asp.net-core visual-studio-2015


    【解决方案1】:

    构建时,请查看“项目”列 - 它指出失败的构建是“ASP.NET Core 5.0”(而不是“ASP.NET 5.0”)。在代码编辑器的左上角下拉菜单中,您可以选择不同的视图 - 如果您选择“ASP.NET Core 5.0”之一,您会看到 NodaTime 命名空间未定义。

    看起来新的 ASP.NET 项目模板正在创建多目标应用程序,包括 aspnet50 和 aspnetcore50。

    ASP.NET 5.0(当前)基于 .NET 4.5.x,因此 NodaTime 可移植(net4)满足该平台。 ASP.NET Core 5.0 基于新的 CoreClr (aspnetcore50),NodaTime 库中没有支持它的二进制文件。

    要解决此问题,您可以通过删除“frameworks”下 project.json 中的“aspnetcore50”条目来在应用程序中删除对 CoreClr 的支持:

    "frameworks": {
        "aspnet50": { }
        //"aspnetcore50": { }
    },
    

    现在您的应用应该只针对 ASP.NET 5.0 而不是 CoreClr 构建。

    【讨论】:

    • 那么您是说现有的“便携式”库与 Core 不兼容,需要为 Core 重新构建?
    • @Nate:PCL/CoreClr 动态仍在确定中。因此,目前不可能知道这一点。据我所知。 :) 现在不可能在 VS 中构建与 CoreClr 兼容的 PCL。
    • 太棒了,谢谢。我一回家就试试。令我惊讶的是,我在 Json.NET 上看到了同样的结果——我希望 MS 能够确保它有效。将仔细检查这不仅仅是用户错误...
    • @JonSkeet:我刚刚用 Newtonsoft.Json 进行了尝试,它确实适用于两个框架(如“编译”)。动作主体为return new[] { new JObject().ToString() };,包版本7.0.1-beta1。
    • 有趣的是,Noda Time 1.3.0 确实列在参考文献中的“ASP.NET Core 5.0”位下 - 没有任何错误迹象或任何迹象。 VS 绝对可以做得更好,帮助诊断这个...
    猜你喜欢
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    相关资源
    最近更新 更多