NSwag не работает с ASP.NET Web API 2 и OWIN. Просто получаю 404

Я пытаюсь настроить NSwag для нового проекта Web API, используя OWIN, но безуспешно. Мне интересно, не упоминают ли в документах что-то или я пропустил шаг. Я следую инструкциям из Middlewares Wiki, но когда я загружаю конечную точку чванства по умолчанию, я просто получаю 404.

Есть ли что-то, что мне нужно сделать, чтобы создать контент, который должен быть в этом месте? Я предполагал, что промежуточное ПО справится с этим.

Требует ли NSwag MVC быть частью вашего проекта? Будет ли это работать в приложении, которое является просто веб-API?

Я ознакомился с примерами проектов, но ни один из них не использует OWIN с ASP.NET Web API 2. Есть только пример global.asax и пример.Net Core.

Вы можете легко воспроизвести мою проблему, если хотите. Просто создайте новое веб-приложение ASP.NET с помощью начального шаблона веб-API OWIN, а затем выполните настройку из Middlewares Wiki. (Когда вы создаете новый проект, в нижней части мастера добавления нового проекта есть ссылка: нажмите здесь, чтобы выйти в Интернет и найти шаблоны. Нажмите на нее и выполните поиск "Начальный шаблон OWIN Web API".

Пожалуйста, дайте мне знать, если я должен предоставить более подробную информацию. Помимо публикации кода, этот стартовый проект должен позволить вам воспроизвести мою проблему за 5-10 минут.

Спасибо!

2 ответа

Решение

Решение, опубликованное @RobertDyball, излишне сложно. По умолчанию обработчик StaticFile является последним обработчиком, который будет выполнен. Это означает, что достаточно просто перехватить все запросы NSwag:

<add name="NSwag" path="swagger" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

Это также был рекомендуемый метод Swashbuckle, пока он не переключился на URL без расширений. Вы можете заметить, что ASP.NET может обрабатывать URL без расширений с помощью одного и того же типа обработчика в <add name="ExtensionlessUrlHandler-Integrated-4.0",

Надеюсь, что это помогает, работает для меня:

  1. клон https://github.com/NSwag/Samples

  2. открытое решение, я использовал VS2015 обновление 3

  3. создайте новый проект Owin MVC и добавьте новый проект "ASP.Net web applation (.Net Framework)" в решение; Я назвал его: SampleOwinWebApiWithSwaggerUi ... использовать шаблон проекта MVC по умолчанию (флажок MVC установлен), также установите флажок "Web API". Изменить аутентификацию, выбрать нет аутентификации, нажать ОК. Щелкните правой кнопкой мыши новый проект и выберите "Сделать стартовым проектом"

  4. добавить пакет nuget... щелкните правой кнопкой мыши новый проект SampleOwinWebApiWithSwaggerUi, выберите Управление пакетами NuGet. Добавьте этот пакет: Microsoft.AspNet.WebApi.Owin (для вас также добавляются другие зависимости, включая Owin + Microsoft.Owin + Microsoft.AspNet.WebApi.Owin)

  5. добавить контроллер веб-API... Я повторно использовал PersonController.cs и связанную с ним модель Persons.cs из проекта SampleWebApiWithSwaggerUi, добавил контроллер в новую папку./api в./Controllers и только что обновил пространства имен и использовал операторы из ' SampleWebApiWithSwaggerUi'в' SampleOwinWebApiWithSwaggerUi'

  6. Добавлен файл запуска Owin.cs, щелкните правой кнопкой мыши проект SampleOwinWebApiWithSwaggerUi, добавьте новый, введите "owin" в поле поиска, выберите класс запуска OWIN, измените имя по умолчанию с Startup1.cs на Startup.cs, нажмите "Добавить"

  7. Добавьте пакет NuGet 'NSwag.AspNet.Owin'... снова, при необходимости, будут добавлены другие пакеты и обновления.

  8. Добавить пакет NuGet для Microsoft.Owin.Host.SystemWeb

  9. обновите Startup.cs, добавив следующие строки:

    // с https://github.com/NSwag/NSwag/wiki/Middlewares
    var config = new HttpConfiguration (); app.UseSwaggerUi (typeof (Автозагрузка). Сборка, новый SwaggerUiOwinSettings()); app.UseWebApi(конфигурации); config.MapHttpAttributeRoutes(); config.EnsureInitialized();

по мере их добавления вам нужно будет добавить следующие зависимости к использованию:

using System.Web.Http;
using NSwag.AspNet.Owin;
  1. обновить web.config, раздел

Я изменился с

<system.webServer>
    <handlers>
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <remove name="OPTIONSVerbHandler" />
        <remove name="TRACEVerbHandler" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>
</system.webServer>

чтобы:

<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true" />
    <handlers>
        <clear />
        <add name="Owin" verb="" path="*" type="Microsoft.Owin.Host.SystemWeb.OwinHttpHandler, Microsoft.Owin.Host.SystemWeb" />
        <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
        <remove name="OPTIONSVerbHandler" />
        <remove name="TRACEVerbHandler" />
        <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        <add name="SwaggerIndex" path="swagger/index.html" verb="*" type="NSwag.AspNet.Owin.SwaggerUiIndexMiddleware" />
        <add name="SwaggerGenerator" path="swagger/v1/swagger.json" verb="*" type="NSwag.AspNet.Owin.SwaggerMiddleware" />
        <add name="SwaggerRedirect" path="swagger" verb="*" type="NSwag.AspNet.Owin.RedirectMiddleware" />
    </handlers>
</system.webServer>

ПРИМЕЧАНИЕ: я не последовал совету здесь https://github.com/NSwag/NSwag/wiki/OwinGlobalAsax поскольку это не помогло мне:

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

так как мы хотим, чтобы Owin startup.cs загружался.

  1. На этом этапе вы сможете использовать / swagger, данные веб-API в порядке, однако статические файлы, такие как bootstrap.css, не обслуживаются для страниц MVC. Чтобы исправить это, я следовал совету здесь: /questions/46735606/ispolzovanie-papki-wwwroot-osnovnoj-stil-aspnet-v-proekte-aspnet-45/46735651#46735651 хотя я изменил корень PhysicalFileSystem, как показано ниже. Этот дополнительный код должен быть добавлен в конец файла startup.cs, после добавления чванства, отмеченного выше.

// для обслуживания статических файлов см.: /questions/46735606/ispolzovanie-papki-wwwroot-osnovnoj-stil-aspnet-v-proekte-aspnet-45/46735651#46735651

string root = AppDomain.CurrentDomain.BaseDirectory;
//var physicalFileSystem = new PhysicalFileSystem(Path.Combine(root, "wwwroot"));
var physicalFileSystem = new PhysicalFileSystem(root));
var options = new FileServerOptions
{
    RequestPath = PathString.Empty,
    EnableDefaultFiles = true,
    FileSystem = physicalFileSystem
};
options.StaticFileOptions.FileSystem = physicalFileSystem;
options.StaticFileOptions.ServeUnknownFileTypes = false;
app.UseFileServer(options);

Наконец, у вас должны работать ASP.Net MVC (со статическими файлами), Web API и Swagger.

Обновление: Рико теперь слился с основным репо: https://github.com/NSwag/Samples

Другие вопросы по тегам