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"
,
Надеюсь, что это помогает, работает для меня:
открытое решение, я использовал VS2015 обновление 3
создайте новый проект Owin MVC и добавьте новый проект "ASP.Net web applation (.Net Framework)" в решение; Я назвал его: SampleOwinWebApiWithSwaggerUi ... использовать шаблон проекта MVC по умолчанию (флажок MVC установлен), также установите флажок "Web API". Изменить аутентификацию, выбрать нет аутентификации, нажать ОК. Щелкните правой кнопкой мыши новый проект и выберите "Сделать стартовым проектом"
добавить пакет nuget... щелкните правой кнопкой мыши новый проект SampleOwinWebApiWithSwaggerUi, выберите Управление пакетами NuGet. Добавьте этот пакет: Microsoft.AspNet.WebApi.Owin (для вас также добавляются другие зависимости, включая Owin + Microsoft.Owin + Microsoft.AspNet.WebApi.Owin)
добавить контроллер веб-API... Я повторно использовал PersonController.cs и связанную с ним модель Persons.cs из проекта SampleWebApiWithSwaggerUi, добавил контроллер в новую папку./api в./Controllers и только что обновил пространства имен и использовал операторы из ' SampleWebApiWithSwaggerUi'в' SampleOwinWebApiWithSwaggerUi'
Добавлен файл запуска Owin.cs, щелкните правой кнопкой мыши проект SampleOwinWebApiWithSwaggerUi, добавьте новый, введите "owin" в поле поиска, выберите класс запуска OWIN, измените имя по умолчанию с Startup1.cs на Startup.cs, нажмите "Добавить"
Добавьте пакет NuGet 'NSwag.AspNet.Owin'... снова, при необходимости, будут добавлены другие пакеты и обновления.
Добавить пакет NuGet для Microsoft.Owin.Host.SystemWeb
обновите 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;
- обновить 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 загружался.
- На этом этапе вы сможете использовать / 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