2016-12-13 77 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,只是更新的鏈接返回到您的回購。現在。 –

    相關問題