Browse Source

Add SwaggerHtmlResolver

pull/5864/head
liangshiwei 5 years ago
parent
commit
7802b8102c
  1. 8
      framework/src/Volo.Abp.Swagger/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs
  2. 6
      framework/src/Volo.Abp.Swagger/Volo.Abp.Swagger.csproj
  3. 9
      framework/src/Volo.Abp.Swagger/Volo/Abp/ISwaggerHtmlResolver.cs
  4. 23
      framework/src/Volo.Abp.Swagger/Volo/Abp/SwaggerHtmlResolver.cs
  5. 14
      framework/src/Volo.Abp.Swagger/wwwroot/swagger/ui/abp.swagger.js
  6. 95
      framework/src/Volo.Abp.Swagger/wwwroot/swagger/ui/index.html
  7. 1
      nupkg/common.ps1
  8. 2
      templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs

8
framework/src/Volo.Abp.Swagger/Microsoft/AspNetCore/Builder/AbpSwaggerUIBuilderExtensions.cs

@ -1,7 +1,7 @@
using System;
using Microsoft.Extensions.DependencyInjection;
using Swashbuckle.AspNetCore.SwaggerUI;
using Volo.Abp.VirtualFileSystem;
using Volo.Abp;
namespace Microsoft.AspNetCore.Builder
{
@ -11,11 +11,13 @@ namespace Microsoft.AspNetCore.Builder
this IApplicationBuilder app,
Action<SwaggerUIOptions> setupAction = null)
{
var fileProvider = app.ApplicationServices.GetService<IVirtualFileProvider>();
var resolver = app.ApplicationServices.GetService<ISwaggerHtmlResolver>();
return app.UseSwaggerUI(options =>
{
options.IndexStream = () => fileProvider.GetFileInfo("/wwwroot/swagger/ui/index.html").CreateReadStream();
options.InjectJavascript("/libs/abp/core/abp.js");
options.InjectJavascript("/swagger/ui/abp.swagger.js");
options.IndexStream = () => resolver.Resolver();
setupAction?.Invoke(options);
});

6
framework/src/Volo.Abp.Swagger/Volo.Abp.Swagger.csproj

@ -18,12 +18,12 @@
</ItemGroup>
<ItemGroup>
<None Remove="wwwroot\swagger\ui\index.html" />
<EmbeddedResource Include="wwwroot\swagger\ui\index.html" />
<ProjectReference Include="..\Volo.Abp.VirtualFileSystem\Volo.Abp.VirtualFileSystem.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.VirtualFileSystem\Volo.Abp.VirtualFileSystem.csproj" />
<None Remove="wwwroot\swagger\ui\abp.swagger.js" />
<EmbeddedResource Include="wwwroot\swagger\ui\abp.swagger.js" />
</ItemGroup>
</Project>

9
framework/src/Volo.Abp.Swagger/Volo/Abp/ISwaggerHtmlResolver.cs

@ -0,0 +1,9 @@
using System.IO;
namespace Volo.Abp
{
public interface ISwaggerHtmlResolver
{
Stream Resolver();
}
}

23
framework/src/Volo.Abp.Swagger/Volo/Abp/SwaggerHtmlResolver.cs

@ -0,0 +1,23 @@
using System.IO;
using System.Reflection;
using System.Text;
using Swashbuckle.AspNetCore.SwaggerUI;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp
{
public class SwaggerHtmlResolver : ISwaggerHtmlResolver, ITransientDependency
{
public virtual Stream Resolver()
{
var stream = typeof(SwaggerUIOptions).GetTypeInfo().Assembly
.GetManifestResourceStream("Swashbuckle.AspNetCore.SwaggerUI.index.html");
var html = new StreamReader(stream)
.ReadToEnd()
.Replace("SwaggerUIBundle(configObject)", "AbpSwaggerUIBundle(configObject)");
return new MemoryStream(Encoding.UTF8.GetBytes(html));
}
}
}

14
framework/src/Volo.Abp.Swagger/wwwroot/swagger/ui/abp.swagger.js

@ -0,0 +1,14 @@
function AbpSwaggerUIBundle(configObject) {
configObject.requestInterceptor = function (request) {
var token = abp.auth.getToken();
request.headers.Authorization = token ? "Bearer " + token : null;
var antiForgeryToken = abp.security.antiForgery.getToken();
if (antiForgeryToken) {
request.headers[abp.security.antiForgery.tokenHeaderName] = antiForgeryToken;
}
return request;
};
return SwaggerUIBundle(configObject);
}

95
framework/src/Volo.Abp.Swagger/wwwroot/swagger/ui/index.html

@ -1,95 +0,0 @@
<!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>%(DocumentTitle)</title>
<link href="https://fonts.googleapis.com/css?family=Open+Sans:400,700|Source+Code+Pro:300,600|Titillium+Web:400,600,700"
rel="stylesheet">
<link rel="stylesheet" type="text/css" href="./swagger-ui.css">
<link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32"/>
<link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16"/>
<style>
html {
box-sizing: border-box;
overflow: -moz-scrollbars-vertical;
overflow-y: scroll;
}
*,
*:before,
*:after {
box-sizing: inherit;
}
body {
margin: 0;
background: #fafafa;
}
</style>
%(HeadContent)
</head>
<body>
<div id="swagger-ui"></div>
<!-- Workaround for https://github.com/swagger-api/swagger-editor/issues/1371 -->
<script>
if (window.navigator.userAgent.indexOf("Edge") > -1) {
console.log("Removing native Edge fetch in favor of swagger-ui's polyfill")
window.fetch = undefined;
}
</script>
<script src="./swagger-ui-bundle.js"></script>
<script src="./swagger-ui-standalone-preset.js"></script>
<script src="/libs/abp/core/abp.js"></script>
<script>
window.onload = function () {
var configObject = JSON.parse('%(ConfigObject)');
var oauthConfigObject = JSON.parse('%(OAuthConfigObject)');
// Workaround for https://github.com/swagger-api/swagger-ui/issues/5945
configObject.urls.forEach(function (item) {
if (item.url.startsWith("http") || item.url.startsWith("/")) return;
item.url = window.location.href.replace("index.html", item.url).split('#')[0];
});
// If validatorUrl is not explicitly provided, disable the feature by setting to null
if (!configObject.hasOwnProperty("validatorUrl"))
configObject.validatorUrl = null
// If oauth2RedirectUrl isn't specified, use the built-in default
if (!configObject.hasOwnProperty("oauth2RedirectUrl"))
configObject.oauth2RedirectUrl = window.location.href.replace("index.html", "oauth2-redirect.html").split('#')[0];
// Apply mandatory parameters
configObject.dom_id = "#swagger-ui";
configObject.presets = [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset];
configObject.layout = "StandaloneLayout";
configObject.requestInterceptor = function (request) {
var token = abp.auth.getToken();
request.headers.Authorization = token ? "Bearer " + token : null;
var antiForgeryToken = abp.security.antiForgery.getToken();
if (antiForgeryToken) {
request.headers[abp.security.antiForgery.tokenHeaderName] = antiForgeryToken;
}
return request;
};
// Begin Swagger UI call region
const ui = SwaggerUIBundle(configObject);
ui.initOAuth(oauthConfigObject);
// End Swagger UI call region
window.ui = ui
}
</script>
</body>
</html>

1
nupkg/common.ps1

@ -136,6 +136,7 @@ $projects = (
"framework/src/Volo.Abp.Validation",
"framework/src/Volo.Abp.VirtualFileSystem",
"framework/src/Volo.Abp.Kafka",
"framework/src/Volo.Abp.Swagger",
# modules/account
"modules/account/src/Volo.Abp.Account.Application.Contracts",

2
templates/module/aspnet-core/host/MyCompanyName.MyProjectName.Web.Host/MyProjectNameWebHostModule.cs

@ -249,7 +249,7 @@ namespace MyCompanyName.MyProjectName
app.UseSwagger();
app.UseAbpSwaggerUI(options =>
{
options.SwaggerEndpoint("/swagger/v1/swagger.json", "Support APP API");
options.SwaggerEndpoint("/swagger/v1/swagger.json", "MyProjectName API");
});
app.UseAuditing();

Loading…
Cancel
Save