2016-12-13 63 views
2

我想在没有运气的情况下使用OWIN在新的Web API项目上获得NSwag设置。我想知道这些文档是不是在提及某件事,或者我错过了一个步骤。我遵循Middlewares Wiki的指示,但是当我加载默认的招摇角端点时,我只得到了404。NSwag不能与ASP.NET Web API 2和OWIN一起使用。刚刚得到404

有什么我需要做的来产生应该在那个位置的内容?我一直假设中间件处理。

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

我已经检出了sample projects,但他们都没有在ASP.NET Web API 2中使用OWIN。只有一个global.asax示例和一个.Net核心示例。

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

请让我知道我是否应该提供更多的细节。除了发布一串代码,即启动项目应该让你重现我的问题在5-10分钟。

谢谢!

+0

MVC是需要的。我认为IIS将.json url作为静态文件处理,并且不会调用中间件...我认为您需要禁用静态文件处理程序全局或用于悬挂的路由... –

回答

1

发表@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。

2

希望这有助于适用于我:

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

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

  3. 创建一个新的Owin MVC项目 添加新的 “ASP.Net网络applation(.Net框架)” 项目的解决方案;我称之为: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和它的从SampleWebApiWithSwaggerUi项目相关模型Persons.cs,添加控制器下./Controllers一个新的文件夹./api和刚刚更新的“SampleWebApiWithSwaggerUi”命名空间和使用语句“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
    变种配置=新HttpConfiguration(); app.UseSwaggerUi(typeof(Startup).Assembly,new SwaggerUiOwinSettings()); app.UseWebApi(con​​fig); config.MapHttpAttributeRoutes(); config.EnsureInitialized();

在添加这些,则需要以下依存添加到usings:

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加载。

    1. 此时,您应该可以使用/ swagger,web api数据ok,但是不会为MVC页面提供诸如bootstrap.css之类的静态文件。为了解决这个问题,我遵循了这里的建议:https://stackoverflow.com/a/36297940/445927虽然我更改了physicalFileSystem根目录,如下所示。这个额外的代码应该添加到startup.cs的末尾,在添加上面的swagger之后。

    //为静态文件,请参阅: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(静态文件),网络API和扬鞭的所有工作。

    更新:波多黎各现已合并到主回购:https://github.com/NSwag/Samples

    +0

    最后一个链接已损坏 –

    +0

    感谢Rico,只是更新的链接返回到您的回购。现在。 –

    相关问题