5

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

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

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

我已经检查了示例项目,但它们都没有将 OWIN 与 ASP.NET Web API 2 一起使用。只有一个 global.asax 示例和一个 .Net Core 示例。

如果你愿意,你可以很容易地重现我的问题。只需使用OWIN Web API Starter Template创建一个新的 ASP.NET Web 应用程序,然后从Middlewares Wiki执行设置。(当您创建一个新项目时,“添加新项目”向导底部附近有一个链接:单击此处联机并查找模板。单击该链接并搜索“OWIN Web API Starter Template”。

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

谢谢!

4

2 回答 2

3

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

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

  2. 打开解决方案,我用的是VS2015 update 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. 添加一个 Web api 控制器...我重新使用了 PersonController.cs 及其关联模型 Persons.cs 来自 SampleWebApiWithSwaggerUi 项目,将控制器添加到 ./Controllers 下的新文件夹 ./api 中,并刚刚更新了命名空间并使用来自 ' 的语句SampleWebApiWithSwaggerUi' 到 'SampleOwinWebApiWithSwaggerUi'

  6. 添加了一个Owin startup.cs文件,右键SampleOwinWebApiWithSwaggerUi项目,新建,在搜索框中输入'owin',选择OWIN Startup类,将默认名称从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); 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 页面。为了解决这个问题,我在这里遵循了建议:https ://stackoverflow.com/a/36297940/445927虽然我更改了物理文件系统根,如下所示。在上面提到的大摇大摆的添加之后,应该将这个额外的代码添加到 startup.cs 的末尾。

// 提供静态文件,参见:https ://stackoverflow.com/a/36297940/445927

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

于 2016-12-15T02:22:41.010 回答
2

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

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

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

于 2017-08-08T12:41:17.793 回答