NSwag 不适用于 ASP.NET Web API 2 和 OWIN。刚收到404

NSwag not working with ASP.NET Web API 2 and OWIN. Just getting 404

我正在尝试使用 OWIN 在一个新的 Web API 项目上设置 NSwag,但没有成功。我想知道文档是否没有提及某些内容,或者我错过了一步。我正在按照 Middlewares Wiki 的说明进行操作,但是当我加载默认的 swagger 端点时,我只得到一个 404。

我需要做些什么来生成应该在那个位置的内容吗?我一直假设中间件会处理这个问题。

NSwag 是否要求 MVC 成为您项目的一部分?它可以在纯 Web API 的应用程序中运行吗?

我已经查看了 sample projects,但它们都没有将 OWIN 与 ASP.NET Web API 2 一起使用。只有一个 global.asax 示例和一个 .网络核心示例。

如果您愿意,可以轻松重现我的问题。只需使用 OWIN Web API 入门模板 创建一个新的 ASP.NET Web 应用程序,然后从 Middlewares Wiki 执行设置。 (当您创建新项目时,添加新项目 向导底部附近有一个 link:单击此处上网查找模板。。单击它并搜索 "OWIN Web API Starter Template"。

如果我需要提供更多详细信息,请告诉我。除了发布一堆代码之外,该启动项目应该允许您在 5-10 分钟内重现我的问题。

谢谢!

希望这对我有帮助,对我有用:

  1. 克隆https://github.com/NSwag/Samples

  2. 打开解决方案,我用的是VS2015 update 3

  3. 创建一个新的 Owin MVC 项目 添加新的 "ASP.Net web applation (.Net Framework)" 项目到解决方案;我称之为:SampleOwinWebApiWithSwaggerUi ...使用默认的 MVC 项目模板(选中 MVC 复选框),同时选中 "Web API" 复选框。 更改身份验证,select 无身份验证,单击确定。 右击新建项目select"Set as Startup Project"

  4. 添加 nuget 包 ... 右键单击新的 SampleOwinWebApiWithSwaggerUi 项目,单击管理 NuGet 包。添加这个包: Microsoft.AspNet.WebApi.Owin(也为您添加其他依赖项,包括 Owin + Microsoft.Owin + Microsoft.AspNet.WebApi.Owin)

  5. 添加网络 api 控制器...我重新使用了 PersonController.cs 及其关联模型 Persons.cs 来自 SampleWebApiWithSwaggerUi 项目,将控制器添加./Controllers 下的新文件夹 ./api 以及刚刚更新的命名空间和 using 语句从 'SampleWebApiWithSwaggerUi' 到 'SampleOwinWebApiWithSwaggerUi'

  6. 添加了一个Owinstartup.cs文件,右击SampleOwinWebApiWithSwaggerUi项目,添加新的,在搜索框中输入'owin',selectOWIN Startupclass,将默认名称从 Startup1.cs 更改为 Startup.cs,单击添加

  7. 添加 'NSwag.AspNet.Owin' NuGet 包 ... 再次根据需要添加其他包和更新。

  8. 添加 'Microsoft.Owin.Host.SystemWeb' NuGet 包

  9. 更新 Startup.cs,添加以下行:

    // 来自 https://github.com/NSwag/NSwag/wiki/Middlewares
    var config = new HttpConfiguration(); app.UseSwaggerUi(typeof(Startup).Assembly, new SwaggerUiOwinSettings()); app.UseWebApi(配置); config.MapHttpAttributeRoutes(); config.EnsureInitialized();

添加这些时,您需要将以下依赖项添加到 usings:

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,web api 数据正常,但是静态文件如 bootstrap.css 不能用于 MVC 页面。为了解决这个问题,我遵循了这里的建议: 尽管我更改了 physicalFileSystem 根目录,如下所示。这个额外的代码应该添加到 startup.cs 的末尾,在上面提到的 swagger 添加之后。

// 提供静态文件,参见:

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 都能正常工作。

更新:Rico 现已合并到主仓库中:https://github.com/NSwag/Samples

@RobertDyball 发布的解决方案不必要地复杂。默认情况下,StaticFile 处理程序是最后一个要执行的处理程序。这意味着简单地拦截所有 NSwag 请求就足够了:

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

这也是 used to be Swashbuckle 推荐的方法,直到它切换到无扩展名 URL。您可能会注意到 ASP.NET 能够使用 <add name="ExtensionlessUrlHandler-Integrated-4.0".

中相同类型的处理程序处理无扩展名的 URL