Почему добавление зависимости в моем проекте веб-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"
},
Итак, что я делаю неправильно? Или это просто ошибка?
Ответы
Ответ 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.