From e8a062f7a2ae51d0b45124be75e16049b3199515 Mon Sep 17 00:00:00 2001 From: Claudia Murialdo Date: Tue, 14 Dec 2021 20:54:48 -0300 Subject: [PATCH 1/3] Add Swagger-UI for open api definitions using Swashbuckle. --- .../GxNetCoreStartup/GxNetCoreStartup.csproj | 1 + .../dotnetcore/GxNetCoreStartup/Startup.cs | 43 ++++++++++++++++--- 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/dotnet/src/dotnetcore/GxNetCoreStartup/GxNetCoreStartup.csproj b/dotnet/src/dotnetcore/GxNetCoreStartup/GxNetCoreStartup.csproj index fcfa33e3d..cdb6440eb 100644 --- a/dotnet/src/dotnetcore/GxNetCoreStartup/GxNetCoreStartup.csproj +++ b/dotnet/src/dotnetcore/GxNetCoreStartup/GxNetCoreStartup.csproj @@ -22,6 +22,7 @@ + diff --git a/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs b/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs index 309c15712..c76bc1b83 100644 --- a/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs +++ b/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs @@ -1,11 +1,13 @@ using System; using System.Collections.Generic; using System.IO; +using System.Reflection; using System.Threading.Tasks; using GeneXus.Configuration; using GeneXus.HttpHandlerFactory; using GeneXus.Services; using GeneXus.Utils; +using GxClasses.Helpers; using GxClasses.Web.Middleware; using log4net; using Microsoft.AspNetCore; @@ -100,7 +102,10 @@ public class Startup const string REST_BASE_URL = "rest/"; const string DATA_PROTECTION_KEYS = "DataProtection-Keys"; const string REWRITE_FILE = "rewrite.config"; - + const string SWAGGER_DEFAULT_YAML = "default.yaml"; + const string DEVELOPER_MENU = "developermenu.html"; + const string SWAGGER_SUFFIX = "swagger"; + public List servicesBase = new List(); private GXRouting gxRouting; @@ -204,7 +209,7 @@ private void ConfigureSessionService(IServiceCollection services, ISessionServic } public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHostingEnvironment env, ILoggerFactory loggerFactory) { - var baseVirtualPath = string.IsNullOrEmpty(VirtualPath) ? VirtualPath : $"/{VirtualPath}"; + string baseVirtualPath = string.IsNullOrEmpty(VirtualPath) ? VirtualPath : $"/{VirtualPath}"; var provider = new FileExtensionContentTypeProvider(); //mappings @@ -231,6 +236,7 @@ public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHos app.UseCookiePolicy(); app.UseSession(); app.UseStaticFiles(); + ConfigureSwaggerUI(app, baseVirtualPath); if (Directory.Exists(Path.Combine(LocalPath, RESOURCES_FOLDER))) { @@ -297,8 +303,8 @@ public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHos servicesBase.Add( string.IsNullOrEmpty(VirtualPath) ? p : $"{VirtualPath}/{p}"); } - var restBasePath = string.IsNullOrEmpty(VirtualPath) ? REST_BASE_URL : $"{VirtualPath}/{REST_BASE_URL}"; - var apiBasePath = string.IsNullOrEmpty(VirtualPath) ? string.Empty : $"{VirtualPath}/"; + string restBasePath = string.IsNullOrEmpty(VirtualPath) ? REST_BASE_URL : $"{VirtualPath}/{REST_BASE_URL}"; + string apiBasePath = string.IsNullOrEmpty(VirtualPath) ? string.Empty : $"{VirtualPath}/"; app.UseMvc(routes => { foreach (string serviceBasePath in servicesBase) @@ -306,7 +312,7 @@ public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHos string tmpPath = string.IsNullOrEmpty(apiBasePath) ? serviceBasePath : serviceBasePath.Replace(apiBasePath, string.Empty); foreach (string sPath in gxRouting.servicesValidPath[tmpPath]) { - var s = serviceBasePath + sPath; + string s = serviceBasePath + sPath; routes.MapRoute($"{s}", new RequestDelegate(gxRouting.ProcessRestRequest)); } } @@ -315,7 +321,7 @@ public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHos }); app.UseWebSockets(); - var basePath = string.IsNullOrEmpty(VirtualPath) ? string.Empty : $"/{VirtualPath}"; + string basePath = string.IsNullOrEmpty(VirtualPath) ? string.Empty : $"/{VirtualPath}"; Config.ScriptPath = basePath; app.MapWebSocketManager($"{basePath}/gxwebsocket.svc"); @@ -327,6 +333,31 @@ public void Configure(IApplicationBuilder app, Microsoft.AspNetCore.Hosting.IHos app.UseEnableRequestRewind(); } + private void ConfigureSwaggerUI(IApplicationBuilder app, string baseVirtualPath) + { + try + { + foreach(string yaml in Directory.GetFiles(LocalPath, "*.yaml")) { + FileInfo finfo = new FileInfo(yaml); + app.UseSwaggerUI(options => + { + options.SwaggerEndpoint($"{baseVirtualPath}/{finfo.Name}", finfo.Name); + options.RoutePrefix =$"{baseVirtualPath.TrimStart('/')}/{finfo.Name}/{SWAGGER_SUFFIX}"; + }); + if (finfo.Name.Equals(SWAGGER_DEFAULT_YAML, StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(LocalPath, DEVELOPER_MENU))) + app.UseSwaggerUI(options => + { + options.SwaggerEndpoint($"{baseVirtualPath}/{SWAGGER_DEFAULT_YAML}", SWAGGER_DEFAULT_YAML); + options.RoutePrefix =$"{baseVirtualPath.TrimStart('/')}/{DEVELOPER_MENU}/{SWAGGER_SUFFIX}"; + }); + } + } + catch (Exception ex) + { + Console.Error.WriteLine("Errpr loading SwaggerUI " + ex.Message); + } + } + private void AddRewrite(IApplicationBuilder app, string rewriteFile, string baseURL) { string rules = File.ReadAllText(rewriteFile); From 03ee9f50bc525dd1f264a133580c094fa509e1bb Mon Sep 17 00:00:00 2001 From: Claudia Murialdo Date: Tue, 18 Jan 2022 15:08:31 -0300 Subject: [PATCH 2/3] Set PrivateAssets for SwaggerUI package reference. --- dotnet/src/dotnetcore/GxNetCoreStartup/GxNetCoreStartup.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dotnet/src/dotnetcore/GxNetCoreStartup/GxNetCoreStartup.csproj b/dotnet/src/dotnetcore/GxNetCoreStartup/GxNetCoreStartup.csproj index cdb6440eb..56fefaf26 100644 --- a/dotnet/src/dotnetcore/GxNetCoreStartup/GxNetCoreStartup.csproj +++ b/dotnet/src/dotnetcore/GxNetCoreStartup/GxNetCoreStartup.csproj @@ -22,7 +22,7 @@ - + From 93b7bd844d7671014f764fbd37599912abbd2d13 Mon Sep 17 00:00:00 2001 From: Claudia Murialdo Date: Sat, 12 Mar 2022 11:26:27 -0300 Subject: [PATCH 3/3] SwaggerUI was not working for iis hosted open apis. --- dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs b/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs index 5d96c9084..be38ed3de 100644 --- a/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs +++ b/dotnet/src/dotnetcore/GxNetCoreStartup/Startup.cs @@ -338,19 +338,22 @@ private void ConfigureSwaggerUI(IApplicationBuilder app, string baseVirtualPath) { try { - foreach(string yaml in Directory.GetFiles(LocalPath, "*.yaml")) { + string baseVirtualPathWithSep = string.IsNullOrEmpty(baseVirtualPath) ? string.Empty: $"{baseVirtualPath.TrimStart('/')}/"; + foreach (string yaml in Directory.GetFiles(LocalPath, "*.yaml")) { FileInfo finfo = new FileInfo(yaml); + app.UseSwaggerUI(options => { - options.SwaggerEndpoint($"{baseVirtualPath}/{finfo.Name}", finfo.Name); - options.RoutePrefix =$"{baseVirtualPath.TrimStart('/')}/{finfo.Name}/{SWAGGER_SUFFIX}"; + options.SwaggerEndpoint($"../../{finfo.Name}", finfo.Name); + options.RoutePrefix =$"{baseVirtualPathWithSep}{finfo.Name}/{SWAGGER_SUFFIX}"; }); if (finfo.Name.Equals(SWAGGER_DEFAULT_YAML, StringComparison.OrdinalIgnoreCase) && File.Exists(Path.Combine(LocalPath, DEVELOPER_MENU))) app.UseSwaggerUI(options => { - options.SwaggerEndpoint($"{baseVirtualPath}/{SWAGGER_DEFAULT_YAML}", SWAGGER_DEFAULT_YAML); - options.RoutePrefix =$"{baseVirtualPath.TrimStart('/')}/{DEVELOPER_MENU}/{SWAGGER_SUFFIX}"; + options.SwaggerEndpoint($"../../{SWAGGER_DEFAULT_YAML}", SWAGGER_DEFAULT_YAML); + options.RoutePrefix =$"{baseVirtualPathWithSep}{DEVELOPER_MENU}/{SWAGGER_SUFFIX}"; }); + } } catch (Exception ex)