Подтвердить что ты не робот

Почему добавление зависимости в моем проекте веб-API (ASP.NET v5) не работает полностью?

Я использую Visual Studio 2015 CTP 6 в Windows 8.1.

Я пытаюсь написать веб-API с помощью ASP.NET v5 с новым форматом файла проекта. Я добавил ссылку на Noda Time v1.3.0 в мой файл project.json, и редактор в Visual Studio подберет ее, но процесс сборки завершился неудачно.

Репро рецепт, прямо с нуля:

  • Открыть VS 2015 CTP 6
  • Создать новый проект в новом решении:
    • Выберите шаблон проекта ASP.NET Web Application
    • Выберите "ASP.NET 5 Preview Web API" в диалоговом окне шаблона
  • Создайте проект, чтобы убедиться, что все правильно.
  • Откройте project.json, а в разделе "зависимостей" (добавьте дополнительную строку) добавьте дополнительную строку в начало (чтобы не добавлять запятую в другую строку):

    "NodaTime": "1.3.0",
    
  • Открыть Controllers\ValuesController.cs
  • Измените метод без параметров Get(), чтобы тело было:

    return DateTimeZoneProviders.Tzdb.Ids;
    
    • DateTimeZoneProviders будет иметь красные squiggles, что разумно - у нас еще нет директивы using.
  • Поместите курсор в DateTimeZoneProviders и нажмите Ctrl + . - вам будет предложено "using NodaTime;" в качестве потенциального исправления... поэтому Intellisense (и, следовательно, Roslyn) определенно знает об этой зависимости.
  • Принять исправление. Уклоны уйдут - все хорошо, правильно?
  • Попробуйте построить решение: вы должны получить две ошибки, в основном указывая, что зависимость не была разрешена.

В проводнике, если вы посмотрите в каталоге решений BugDemo, вы найдете каталог artifacts\obj\BugDemo\Debug\ProjectRawReferences, содержащий каталоги ASP.NET Core 5.0 и "ASP.NET 5.0", оба из которых имеют много DLL в... но не Noda Time.

Щелчок правой кнопкой мыши по проекту и выбор "Восстановить пакеты" не исправляет это.

Когда я создаю один и тот же проект с использованием Project K, kpm restore забирает Noda Time, и если вы добавите раздел в project.json, как показано ниже, то k web работает и посещает http://localhost:5001/api/values покажет вам все идентификаторы часовых поясов TZDB:

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

Итак, что я делаю неправильно? Или это просто ошибка?

4b9b3361

Ответ 1

Когда вы создаете, посмотрите столбец "Проект" - он отмечает, что сбой сборки - "ASP.NET Core 5.0" (а не "ASP.NET 5.0" ). В верхнем левом раскрывающемся списке редактора кода вы можете выбрать разные представления - если вы выберете "ASP.NET Core 5.0", вы увидите, что пространство имен NodaTime undefined.

Похоже, что новые шаблоны проектов ASP.NET создают многоцелевые приложения, как aspnet50, так и aspnetcore50.

ASP.NET 5.0 (в настоящее время) основан на .NET 4.5.x, поэтому NodaTime portable (net4) удовлетворяет этой платформе. ASP.NET Core 5.0 основан на новом CoreClr (aspnetcore50), и в библиотеке NodaTime нет поддерживаемых файлов.

Чтобы решить проблему, вы можете просто отказаться от поддержки CoreClr в своем приложении, удалив запись "aspnetcore50" в project.json в разделе "frameworks":

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

Теперь ваше приложение должно строить только таргетинг на ASP.NET 5.0, а не на CoreClr.