Продолжайте работу IIS Express в веб-проекте dotnet cli, ориентированном на .NetCoreApp

У меня есть веб-приложение dotnet cli в Visual Studio, использующее новое расширение xproj и project.json.

dotnet new --t web --lang c#

У меня отлично работает сайт на .NetCoreApp. Однако я не могу загрузить сайт в IIS без добавления к нему промежуточного программного обеспечения в зависимости от IIS, чего я бы не хотел делать.

Поэтому я использую IIS Express.

Для этого мне нужно запустить проект, чтобы запустить IIS, чтобы иметь возможность использовать сайт в режиме отладки.

Что я хотел бы знать, так это то, как я могу заставить IIS Express продолжать работать и вместо этого подключаться к нему при запуске проекта.

Я прочитал все руководства по отключению «Изменить и продолжить». Это действительно работает в веб-приложениях ASP.Net, но это основное веб-приложение dotnet, а не тот же тип проекта. В нем нет окна «Свойства» с параметрами для отключения «Редактировать и продолжить», а отключение «Редактировать и продолжить» в параметрах отладки IDE не имеет никакого эффекта.

IIS закрывается, когда я прекращаю выполнение проекта.

Любые идеи?

При желании, как я могу настроить его для локального запуска в IIS, не полагаясь на него, лучший вариант, который я могу придумать, - это использовать условную компиляцию.


person Ryan Mann    schedule 29.07.2016    source источник
comment
Вам следует еще раз проверить описание и провести четкое различие между IIS и IIS Express. В настоящее время вы смешиваете два, и вопрос трудно понять.   -  person Lex Li    schedule 29.07.2016
comment
Все это не имеет значения теперь, когда я понял, как использовать dotnet run, что я и хотел. Моя цель состояла в том, чтобы мой сайт работал без прикрепленного отладчика. dotnet run и kestrel прекрасно для этого подходят. Я удалю этот вопрос в ближайшее время.   -  person Ryan Mann    schedule 29.07.2016
comment
@Ryios, пожалуйста, не удаляйте этот вопрос ... вместо этого рассмотрите возможность публикации своего решения в качестве ответа. Спасибо   -  person objectNotFound    schedule 29.07.2016


Ответы (2)


Вся цель моего вопроса заключалась в том, чтобы мой сайт работал без использования f5 в Visual Studio и без подключения отладчика.

Решение, оказывается, простое.

Вы можете просто запустить его в Kestrel в консольном терминале.

Просто откройте терминал или командную строку в корне вашего проекта и введите:

dotnet run

Это запустит kestrel для вашего проекта и сообщит вам, на каком порту он находится. Затем вы можете нажать http://localhost:5000 (или указать порт) в своем браузере.

Обновление: вы также можете отключить свою зависимость от IIS Express во всем приложении и запустить f5 в Kestrel.

Сделать это:

  1. Щелкните правой кнопкой мыши свой проект и перейдите к свойствам
  2. Щелкните вкладку отладки
  3. Нажмите «Создать» рядом с раскрывающимся списком профилей.
  4. Назовите это Кестрел Дев
  5. Измените тип запуска на "Проект"
  6. Установите для аргументов приложения значение «dotnet run».
  7. Добавьте переменную среды для «ASPNETCORE_ENVIRONMENT».
  8. Установите значение «Развитие».
  9. Add an environment variable for "ASPNETCORE_URLS"
    1. Give it a value of "http://localhost:8080" or whatever url/port you want it to run on.

Повторите приведенные выше параметры для «Производство пустельги», но установите для ASPNETCORE_ENVIRONMENT значение «Производство».

ASPNETCORE_ENVIRONMENT используется для обработки ваших преобразований конфигурации json.

    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();

        Configuration = builder.Build();
    }

Так что, если вам нужен файл appSettings.json для разработки (локальной), подготовки и производства, вам нужно создать 3 файла appSettings.json.

appSettings.json 
appSettings.Development.json
appSettings.Staging.json
appSettings.Production.json

Затем вы делаете файлы .Staging.Json и т. д. необязательными с опцией: true config выше.

Итак, в appSettings.json у вас есть все, что одинаково во всех средах.

Затем в appSettings.Development.json у вас могут быть вещи, которые вам нужны только при локальном запуске.

и т.д.

Вы создаете профиль для каждой среды, поэтому, если вы запускаете «Kestrel Development», он использует appSettings.Development.Json.

Если вы запускаете «Kestrel Staging», он использует appSettings.Staging.Json.

Если вы запускаете «Kestrel Production», он использует appSettings.Production.json.

Это также влияет на то, как ваш tagHelper работает в ваших представлениях MVC, например.

<environment names="Development">
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</environment>
<environment names="Staging,Production">
    <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.6/css/bootstrap.min.css"
          asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
          asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
    <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
</environment>

В этом html, если вы используете «Kestrel Development», выводится html внутри тега среды для разработки.

Если вы используете Kestrel Production, то выводится html внутри тега среды для постановки,производства.

person Ryan Mann    schedule 29.07.2016
comment
Рад помочь, просто жаль, что мне не потребовалось 2 часа, чтобы понять это. Я рекомендую прочитать все руководства по командам dotnet cli, прежде чем начинать основной проект. Теперь мне просто нужно, чтобы bundleConfig.Json и все помощники по тегам работали, и я в деле. - person Ryan Mann; 29.07.2016
comment
хорошо ... так как это все совершенно новая технология, я думаю, что тогда будет больше вопросов и ответов на них? :) - person objectNotFound; 29.07.2016
comment
Стоит отметить, что я выяснил, как заставить его работать в IIS, однако, поскольку вам нужно опубликовать его в другой папке, вы не можете вносить изменения в IDE и обновлять страницу, вам нужно запускать публикацию dotnet каждый раз, когда вы хотите увидеть изменение, и это победило цель. Таким образом, запуск dotnet кажется лучшим способом. - person Ryan Mann; 29.07.2016
comment
Обновил свой ответ, я понял, как заставить f5 запускать пустельгу. После всего этого просто отредактируйте файл launchSettings.json и создайте профили пустельги над профилем IIS Express. - person Ryan Mann; 29.07.2016

Если запустить без отладчика (Ctrl+F5 или в меню Отладка -> Запустить без отладчика), приложение продолжит работать в IIS Express (при условии, что вы используете настройки по умолчанию). Вы можете вносить изменения и обновлять браузер без публикации или перезапуска.

С обычным IIS вы можете указать веб-сайт/приложение в папке проекта, и вам никогда не придется публиковать после каждого изменения.

person OdeToCode    schedule 16.08.2016
comment
Указание IIS на папку проекта не работает с .Net Core. В папке проекта нет среды выполнения для DotNet Core, поэтому ее невозможно загрузить. Вы должны указать IIS на опубликованную папку Dot Net Core, которую вы получаете, запустив DotNet Publish, и она окажется в вашей папке bin\debug. Затем вы не сможете вносить в нее живые изменения, вам нужно повторно опубликовать с помощью команды dotnet линия. Однако экспресс-часть IIS действительна. - person Ryan Mann; 16.08.2016
comment
Запуск dotnet в окне терминала решает проблему, вы можете вносить изменения в сайт в реальном времени, и вам нужно будет только пересобирать изменения скомпилированного кода. Я также считаю, что использование метода Kestrel — лучший способ, потому что он гарантирует, что ваш процесс разработки соответствует кросс-платформенным Jedi Ways. - person Ryan Mann; 16.08.2016
comment
Указание на папку проекта работает, если у вас есть правильная конфигурация, что, по общему признанию, непросто. Например, убедитесь, что AspNetCoreModule установлен в IIS, убедитесь, что ApplicationPoolIdentity имеет разрешения на папку проекта, убедитесь, что web.config не содержит параметризованных записей, таких как %LAUNCHER_PATH%, которые необходимо заменить на .NET. Я забыл некоторые проблемы, необходимые для осуществления этого. - person OdeToCode; 16.08.2016
comment
Вы будете использовать Kestrel в качестве сервера даже при работе под IIS или IIS Express. IIS — это только хост-процесс. - person OdeToCode; 16.08.2016