Как заставить IIS распознавать класс запуска OWIN?

Мой веб-сервис OWIN прекрасно работает в Visual Studio 2013, но когда я публикую его на реальном сайте IIS, он действует так, как если бы метод Configuration в классе запуска не был запущен. Я могу делать "нормальные" вещи, такие как просмотр приложения и просмотр структуры каталогов, но ничто из того, что якобы было настроено с помощью IAppBuilder, не работает. Например, я получаю сообщение об ошибке 404.0 при просмотре URL-адреса, который был настроен при запуске для выдачи маркера носителя OAuth2. Как будто Startup.Configuration(приложение IAppBuilder) никогда не запускался.

Я использую [assembly: OwinStartup(typeof(MyNamespacedStartupClass))] атрибут для обозначения класса запуска.

Я использовал NuGet для получения Microsoft.Owin.Host.SystemWeb и Microsoft.Owin.Diagnostics по инструкциям, которые я видел, но это не имеет значения.

Что еще мне нужно сделать?

5 ответов

Решение
  1. Убедитесь, что ваш пул приложений находится в интегрированном режиме v4.0.
  2. Убедитесь, что вы поместили bin в Microsoft.Owin.Host.SystemWeb (я вижу, вы установили его) - просто убедитесь, что он также находится в папке bin.

В этой статье будет больше информации о том, как промежуточное программное обеспечение OWIN работает на интегрированном конвейере.

Я также должен был добавить дополнительную настройку в мой web.config

<configuration>    
    <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" />       
    </system.webServer> 
</configuration>

От: https://katanaproject.codeplex.com/wikipage?title=Static%20Files%20on%20IIS

IIS имеет собственный модуль статического файла, который оптимизирован для пропуска других частей конвейера, если он видит пути к файлам, которые не соответствуют другим обработчикам (например, не aspx). Это означает, что промежуточное ПО браузера каталогов, вероятно, будет работать, но тогда статическое файловое промежуточное ПО может быть обойдено в пользу собственного статического файлового модуля.

Это говорит IIS не пропускать управляемые модули Asp.Net, даже если собственный статический файловый модуль считает, что он соответствует.

Это также описывает другой шаг, но это не было необходимо для меня:

Кроме того, добавьте следующий маркер этапа ПОСЛЕ вашего статического файлового промежуточного ПО (в пространстве имен Microsoft.Owin.Extensions): app.UseStageMarker(PipelineStage.MapHandler);

Вероятно, причина в том, что вы обновились в какой-то момент из более старого MVC:

Убедитесь, что у вас нет

  <add key="owin:AutomaticAppStartup" value="false" />

в вашем web.config, Это будет подавлять вызов стартапа

Вместо этого измените это на это

  <add key="owin:AutomaticAppStartup" value="true" />

Где-то вдоль линии - когда я обновился до MVC 5, это было добавлено (фактически почти иронично, это было год назад завтра), и я даже не знал, что owin был до сегодняшнего дня, когда я пытался его использовать.

Я также столкнулся с такими же проблемами, когда перенес свой уже запущенный сайт MVC5 на новый сервер. Это дало мне кошмары, просто чтобы напомнить, я должен был сделать все это, чтобы заставить его работать

  1. добавлять [assembly: OwinStartupAttribute(typeof([YourAssemblyName].Startup))] это для класса Startup (после операторов using и до объявления пространства имен)
  2. Добавьте эти ключи к <appSettings> раздел web.config

    <add key="owin:AppStartup" value="[NamespaceForYourStartUpClass].Startup, [YourAssemblyName]" />
    <add key="owin:AutomaticAppStartup" value="true" />
    
  3. И, наконец, в соответствии с предложением Мартин Эвенс добавить следующее <system.webserver> раздел в web.config

    <modules runAllManagedModulesForAllRequests="true" />
    

Для тех, кто имеет дело с устаревшими и (или) мигрированными версиями. Проверьте окна «Роли и функции», найдите, какая версия ASP.net установлена, и используйте точно такую ​​же версию в web.config для targetFramework, например, в моем случае это была 4.6, а не 4.8, поэтому

      <system.web>
    <httpRuntime targetFramework="4.6" requestValidationMode="2.0" maxQueryStringLength="2097151" />
    <compilation targetFramework="4.6" optimizeCompilations="true">
Другие вопросы по тегам