我正在尝试使用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分钟内重现我的问题。
谢谢!
答案 0 :(得分:2)
希望这有用,对我有用:
开放式解决方案,我使用VS2015更新3
创建一个新的Owin MVC项目 添加新的" ASP.Net Web应用程序(.Net Framework)"项目解决方案;我叫它:SampleOwinWebApiWithSwaggerUi ...使用默认的MVC项目模板(选中MVC复选框),同时检查" Web API"复选框。 更改身份验证,选择无身份验证,单击确定。 右键单击新项目,然后选择"设置为启动项目"
添加nuget包... 右键单击新的SampleOwinWebApiWithSwaggerUi项目,单击Manage NuGet packages。添加此包: Microsoft.AspNet.WebApi.Owin(为您添加其他依赖项,包括Owin + Microsoft.Owin + Microsoft.AspNet.WebApi.Owin)
添加一个web api控制器...我重新使用了PersonController.cs及其与SampleWebApiWithSwaggerUi项目相关的模型Persons.cs,将控制器添加到./下的新文件夹./api。控制器和刚更新的命名空间以及使用来自' SampleWebApiWithSwaggerUi' to' SampleOwinWebApiWithSwaggerUi'
添加了一个Owin startup.cs文件,右键单击SampleOwinWebApiWithSwaggerUi项目,添加新文件,输入' owin'在搜索框中,选择OWIN Startup类,将默认名称从Startup1.cs更改为Startup.cs,单击Add
添加' NSwag.AspNet.Owin' NuGet包...再次根据需要添加其他包和更新。
添加' Microsoft.Owin.Host.SystemWeb' NuGet包
更新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;
我改变了
<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。
//提供静态文件,请参阅: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。