NSwag不使用ASP.NET Web API 2和OWIN。刚刚获得404

时间:2016-12-13 21:46:52

标签: asp.net-web-api2 owin nswag

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

我是否需要做一些事情来生成应该在该位置的内容?我一直在假设中间件处理它。

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

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:2)

希望这有用,对我有用:

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

  2. 开放式解决方案,我使用VS2015更新3

  3. 创建一个新的Owin MVC项目 添加新的" ASP.Net Web应用程序(.Net Framework)"项目解决方案;我叫它:SampleOwinWebApiWithSwaggerUi ...使用默认的MVC项目模板(选中MVC复选框),同时检查" Web API"复选框。 更改身份验证,选择无身份验证,单击确定。 右键单击新项目,然后选择"设置为启动项目"

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

  5. 添加一个web api控制器...我重新使用了PersonController.cs及其与SampleWebApiWithSwaggerUi项目相关的模型Persons.cs,将控制器添加到./下的新文件夹./api。控制器和刚更新的命名空间以及使用来自' SampleWebApiWithSwaggerUi' to' SampleOwinWebApiWithSwaggerUi'

  6. 添加了一个Owin startup.cs文件,右键单击SampleOwinWebApiWithSwaggerUi项目,添加新文件,输入' owin'在搜索框中,选择OWIN Startup类,将默认名称从Startup1.cs更改为Startup.cs,单击Add

  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();

  10. 在添加这些内容时,您需要将以下依赖项添加到usings:

    using System.Web.Http;
    using NSwag.AspNet.Owin;
    
    1. 更新web.config,部分
    2. 我改变了

      <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数据,但是不能为MVC页面提供bootstrap.css等静态文件。为了解决这个问题,我在这里遵循了建议:https://stackoverflow.com/a/36297940/445927虽然我更改了physicalFileSystem root,如下所示。在上面提到的swagger添加之后,应将此附加代码添加到startup.cs的末尾。
      2. //提供静态文件,请参阅: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

答案 1 :(得分:2)

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

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

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