Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
856c70d4ac | ||
|
|
dfa9fbf909 | ||
|
|
883315bc30 | ||
|
|
4ed517ac90 | ||
|
|
eacbbc3071 | ||
|
|
ee3a3a9d56 | ||
|
|
61672c5770 | ||
|
|
c6b9746603 | ||
|
|
f7e1b9be2a | ||
|
|
d0fe883e74 | ||
|
|
e4773f3154 | ||
|
|
ba7b3ecd60 | ||
|
|
f52c19938f | ||
|
|
83ab8ba385 | ||
|
|
7d70e8326a | ||
|
|
2abe486151 | ||
|
|
f1138a5a10 | ||
|
|
31df4a7593 | ||
|
|
dbc05c13ee | ||
|
|
e90cc2d86e | ||
|
|
3cbd8b7559 | ||
|
|
d54b71badb | ||
|
|
ddeb2948b7 | ||
|
|
fb1ce7d931 | ||
|
|
c117d9ef1f | ||
|
|
9b38ee9b39 | ||
|
|
116dd1a808 | ||
|
|
26753657b8 | ||
|
|
62ffe47d25 | ||
|
|
bb2f4641a3 | ||
|
|
aadc4128f0 | ||
|
|
a8ce74f35d | ||
|
|
44ed8dfd3c | ||
|
|
a7261fde58 | ||
|
|
453a15b9ad | ||
|
|
5a04f831a7 | ||
|
|
fdfde570c7 | ||
|
|
874f5b6cef | ||
|
|
86ec43f676 | ||
|
|
66334d6535 | ||
|
|
608fb26aa2 | ||
|
|
c4e852a0df | ||
|
|
d88ee5f50d | ||
|
|
ad53bb3530 | ||
|
|
e8d5496ef5 | ||
|
|
3edb472bfb |
@@ -0,0 +1,21 @@
|
||||
name: PublishNugetPackage
|
||||
|
||||
on: [create]
|
||||
|
||||
jobs:
|
||||
publish:
|
||||
name: Publish Project to Nuget
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v1
|
||||
- name: Setup .NET Core
|
||||
uses: actions/setup-dotnet@v1
|
||||
with:
|
||||
dotnet-version: '5.0.100'
|
||||
- name: Publish
|
||||
run: |
|
||||
version=`git describe --tags`
|
||||
dotnet build --configuration release -p:PackageVersion=$version
|
||||
dotnet nuget push bin/release/Simcu.SimApi.$version.nupkg -k ${NUGET_APIKEY} -s https://www.nuget.org/api/v2/package
|
||||
env:
|
||||
NUGET_APIKEY: ${{ secrets.NUGET_APIKEY }}
|
||||
@@ -1,16 +0,0 @@
|
||||
name: PublishToNuget
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: publish to nuget
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
with:
|
||||
fetch-depth: 2
|
||||
- name: Publish NuGet
|
||||
uses: rohith/publish-nuget@v1.0.3
|
||||
with:
|
||||
nuget_key: ${{ secrets.NugetKey }}
|
||||
@@ -1,6 +1,7 @@
|
||||
# Created by .ignore support plugin (hsz.mobi)
|
||||
### C template
|
||||
# Prerequisites
|
||||
*.sln:
|
||||
*.d
|
||||
|
||||
# Object files
|
||||
|
||||
@@ -0,0 +1,59 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using SimApi.Communications;
|
||||
using SimApi.Exceptions;
|
||||
|
||||
namespace SimApi.Attributes
|
||||
{
|
||||
/// <summary>
|
||||
/// 检测登录中间件
|
||||
/// </summary>
|
||||
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
|
||||
public class SimApiAuthAttribute : ActionFilterAttribute
|
||||
{
|
||||
private string[] Types { get; }
|
||||
|
||||
|
||||
//默认是user登录类型
|
||||
public SimApiAuthAttribute()
|
||||
{
|
||||
Types = new[] { "user" };
|
||||
}
|
||||
|
||||
//只检测一种用户类型的快捷方式
|
||||
public SimApiAuthAttribute(string type)
|
||||
{
|
||||
Types = new[] { type };
|
||||
}
|
||||
|
||||
//设定特定类型的检测
|
||||
public SimApiAuthAttribute(string[] types)
|
||||
{
|
||||
Types = types;
|
||||
}
|
||||
|
||||
//只检测一种用户类型的快捷方式
|
||||
public SimApiAuthAttribute(string type, string url)
|
||||
{
|
||||
Types = new[] { type };
|
||||
new HttpPostAttribute(url);
|
||||
}
|
||||
|
||||
public override void OnActionExecuting(ActionExecutingContext context)
|
||||
{
|
||||
var loginInfo = (SimApiLoginItem)context.HttpContext.Items["LoginInfo"];
|
||||
//检测是否登录
|
||||
if (loginInfo == null)
|
||||
{
|
||||
throw new SimApiException(401);
|
||||
}
|
||||
//检测用户类型
|
||||
if (Types.Intersect(loginInfo.Type).Count() == 0)
|
||||
{
|
||||
throw new SimApiException(403);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,22 @@
|
||||
using Swashbuckle.AspNetCore.Annotations;
|
||||
using System;
|
||||
using Swashbuckle.AspNetCore.Annotations;
|
||||
|
||||
namespace YYApi.Helpers
|
||||
namespace SimApi.Attributes
|
||||
{
|
||||
/// <summary>
|
||||
/// 快捷自定义接口文档类
|
||||
/// </summary>
|
||||
public class ApiDoc : SwaggerOperationAttribute
|
||||
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
|
||||
public class SimApiDocAttribute : SwaggerOperationAttribute
|
||||
{
|
||||
/// <summary>
|
||||
/// 定义接口说明
|
||||
/// </summary>
|
||||
/// <param name="tag">接口分组</param>
|
||||
/// <param name="name">接口名称</param>
|
||||
public ApiDoc(string tag, string name)
|
||||
public SimApiDocAttribute(string tag, string name)
|
||||
{
|
||||
Tags = new[] {tag};
|
||||
Tags = new[] { tag };
|
||||
Summary = name;
|
||||
// Consumes = new[] {"application/json"};
|
||||
// Produces = new[] {"application/json"};
|
||||
@@ -0,0 +1,20 @@
|
||||
using System;
|
||||
namespace SimApi.Communications
|
||||
{
|
||||
/// <summary>
|
||||
/// 只有ID的请求
|
||||
/// </summary>
|
||||
public class SimApiIdOnlyRequest
|
||||
{
|
||||
public int Id { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 基础分页请求
|
||||
/// </summary>
|
||||
public class SimApiBasePageRequest
|
||||
{
|
||||
public int Page { get; set; }
|
||||
public int Count { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,13 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Serialization;
|
||||
using Newtonsoft.Json.Serialization;
|
||||
|
||||
namespace YYApi.Communications
|
||||
namespace SimApi.Communications
|
||||
{
|
||||
public class BaseResponse
|
||||
/// <summary>
|
||||
/// 基础相应
|
||||
/// </summary>
|
||||
public class SimApiBaseResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 错误代码
|
||||
@@ -23,6 +25,7 @@ namespace YYApi.Communications
|
||||
private readonly Dictionary<int, string> MsgBox = new Dictionary<int, string>()
|
||||
{
|
||||
{200, "成功"},
|
||||
{204, "没有数据"},
|
||||
{400, "参数错误"},
|
||||
{401, "需要登录"},
|
||||
{403, "无权访问"},
|
||||
@@ -33,16 +36,17 @@ namespace YYApi.Communications
|
||||
/// <summary>
|
||||
/// 返回一个成功的空结果
|
||||
/// </summary>
|
||||
public BaseResponse()
|
||||
public SimApiBaseResponse()
|
||||
{
|
||||
SetCode(200);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 返回指定代码的描述
|
||||
/// </summary>
|
||||
/// <param name="code">错误代码</param>
|
||||
public BaseResponse(int code)
|
||||
public SimApiBaseResponse(int code)
|
||||
{
|
||||
SetCode(code);
|
||||
}
|
||||
@@ -52,7 +56,7 @@ namespace YYApi.Communications
|
||||
/// </summary>
|
||||
/// <param name="code">错误代码</param>
|
||||
/// <param name="message">错误信息</param>
|
||||
public BaseResponse(int code, string message)
|
||||
public SimApiBaseResponse(int code, string message)
|
||||
{
|
||||
SetCodeMsg(code, message);
|
||||
}
|
||||
@@ -95,4 +99,37 @@ namespace YYApi.Communications
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 动态内容分页
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
public class SimApiBasePageResponse<T> : SimApiBaseResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 动态内容列表
|
||||
/// </summary>
|
||||
public T List { get; set; }
|
||||
|
||||
//当前页码
|
||||
public int Page { get; set; }
|
||||
|
||||
//每页条数
|
||||
public int Count { get; set; }
|
||||
|
||||
//总计条数
|
||||
public int Total { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 动态Data返回
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
public class SimApiBaseResponse<T> : SimApiBaseResponse
|
||||
{
|
||||
/// <summary>
|
||||
/// 动态内容列表
|
||||
/// </summary>
|
||||
public T Data { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
namespace SimApi.Communications
|
||||
{
|
||||
/// <summary>
|
||||
/// 登录信息中间件
|
||||
/// </summary>
|
||||
public class SimApiLoginItem
|
||||
{
|
||||
//登录用户的ID
|
||||
public int Id { get; set; }
|
||||
//登录用户来源
|
||||
public string[] Type { get; set; }
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,12 @@
|
||||
using YYApi.Communications;
|
||||
using YYApi.Helpers;
|
||||
using SimApi.Communications;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
||||
using System.Linq;
|
||||
using SimApi.Exceptions;
|
||||
using SimApi.Attributes;
|
||||
|
||||
namespace YYApi.Controllers
|
||||
namespace SimApi.Controllers
|
||||
{
|
||||
/// <summary>
|
||||
/// 基础控制器,所有控制器均继承本控制器
|
||||
@@ -13,9 +14,12 @@ namespace YYApi.Controllers
|
||||
/// 2. 报错返回
|
||||
/// 3. 错误回馈页面
|
||||
/// </summary>
|
||||
public class BaseController : Controller
|
||||
public class SimApiBaseController : Controller
|
||||
{
|
||||
protected int LoginId => int.Parse(HttpContext.Items["LoginId"].ToString());
|
||||
/// <summary>
|
||||
/// 当前登录用户的ID
|
||||
/// </summary>
|
||||
protected SimApiLoginItem LoginInfo => (SimApiLoginItem)HttpContext.Items["LoginInfo"];
|
||||
|
||||
/// <summary>
|
||||
/// 验证请求参数
|
||||
@@ -43,9 +47,9 @@ namespace YYApi.Controllers
|
||||
/// <param name="code">错误代码</param>
|
||||
/// <param name="message">错误描述(若是常规错误,代码可自动带取描述)</param>
|
||||
/// <returns></returns>
|
||||
protected static void Error(int code, string message = null)
|
||||
protected static void Error(int code = 500, string message = "")
|
||||
{
|
||||
throw new ApiException(code, message);
|
||||
throw new SimApiException(code, message);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -54,7 +58,7 @@ namespace YYApi.Controllers
|
||||
/// <param name="condition">检测条件</param>
|
||||
/// <param name="code">错误代码</param>
|
||||
/// <param name="message">错误描述</param>
|
||||
protected static void ErrorWhen(bool condition, int code, string message = null)
|
||||
protected static void ErrorWhen(bool condition, int code = 500, string message = "")
|
||||
{
|
||||
if (condition)
|
||||
{
|
||||
@@ -63,17 +67,25 @@ namespace YYApi.Controllers
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 错误回馈页面
|
||||
/// 检测给定的变量是否为NUll
|
||||
/// </summary>
|
||||
/// <param name="condition">检测条件</param>
|
||||
/// <param name="code">错误代码</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("exception/{code:int}")]
|
||||
[ApiExplorerSettings(IgnoreApi = true)]
|
||||
public BaseResponse ExceptionHandler(int code)
|
||||
/// <param name="message">错误描述</param>
|
||||
protected static void ErrorWhenNull(object condition, int code = 404, string message = "")
|
||||
{
|
||||
var response = new BaseResponse();
|
||||
response.SetCode(code);
|
||||
return response;
|
||||
ErrorWhen(condition == null, code, message);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 上传文件
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
protected SimApiBaseResponse<string> UploadFile()
|
||||
{
|
||||
return new SimApiBaseResponse<string>();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
using System;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using SimApi.Attributes;
|
||||
using SimApi.Communications;
|
||||
using SimApi.Helpers;
|
||||
|
||||
namespace SimApi.Controllers
|
||||
{
|
||||
public class YYCommonController : SimApiBaseController
|
||||
{
|
||||
private SimApiAuth Auth { get; }
|
||||
|
||||
public YYCommonController(SimApiAuth auth)
|
||||
{
|
||||
Auth = auth;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 错误回馈页面
|
||||
/// </summary>
|
||||
/// <param name="code">错误代码</param>
|
||||
/// <returns></returns>
|
||||
[HttpGet("exception/{code:int}")]
|
||||
[ApiExplorerSettings(IgnoreApi = true)]
|
||||
public SimApiBaseResponse ExceptionHandler(int code)
|
||||
{
|
||||
var response = new SimApiBaseResponse();
|
||||
response.SetCode(code);
|
||||
return response;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检测用户登陆的控制器
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("/auth/check"), SimApiDoc("认证", "检测登陆")]
|
||||
public SimApiBaseResponse<int> CheckLogin()
|
||||
{
|
||||
ErrorWhenNull(LoginInfo, 401);
|
||||
return new SimApiBaseResponse<int> { Data = LoginInfo.Id };
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 退出登陆
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost("/auth/logout"), SimApiDoc("认证", "退出登陆")]
|
||||
public SimApiBaseResponse Logout()
|
||||
{
|
||||
string token = null;
|
||||
|
||||
if (Request.Headers.ContainsKey("Token"))
|
||||
{
|
||||
token = Request.Headers["Token"];
|
||||
}
|
||||
Auth.Logout(token);
|
||||
return new SimApiBaseResponse();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
namespace SimApi.Exceptions
|
||||
{
|
||||
/// <summary>
|
||||
/// Api错误捕获异常
|
||||
/// </summary>
|
||||
public class SimApiException : Exception
|
||||
{
|
||||
public int Code { get; }
|
||||
|
||||
public SimApiException(int code, string message = "") : base(message)
|
||||
{
|
||||
Code = code;
|
||||
}
|
||||
}
|
||||
}
|
||||
-143
@@ -1,143 +0,0 @@
|
||||
using System;
|
||||
using YYApi.Helpers;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.OpenApi.Models;
|
||||
using Swashbuckle.AspNetCore.SwaggerUI;
|
||||
|
||||
namespace YYApi
|
||||
{
|
||||
/// <summary>
|
||||
/// 加入系统的扩展信息
|
||||
/// </summary>
|
||||
public static class Extensions
|
||||
{
|
||||
/// <summary>
|
||||
/// 添加自定义授权认证中间价
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddAuth(this IServiceCollection builder)
|
||||
{
|
||||
return builder.AddScoped<Auth>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加整个YYAPI
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title"></param>
|
||||
/// <param name="description"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddYYApi(this IServiceCollection builder, string title,
|
||||
string description = null)
|
||||
{
|
||||
return builder.AddAuth().AddApiDoc(title, description);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加Api文档服务
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title">文档标题</param>
|
||||
/// <param name="description">文档描述</param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddApiDoc(this IServiceCollection builder, string title,
|
||||
string description = null)
|
||||
{
|
||||
return builder.AddSwaggerGen(x =>
|
||||
{
|
||||
x.SwaggerDoc("api", new OpenApiInfo {Title = title, Description = description});
|
||||
x.EnableAnnotations();
|
||||
x.AddSecurityRequirement(new OpenApiSecurityRequirement
|
||||
{
|
||||
{
|
||||
new OpenApiSecurityScheme
|
||||
{
|
||||
Reference = new OpenApiReference {Type = ReferenceType.SecurityScheme, Id = "HeaderToken"}
|
||||
},
|
||||
new[] {"readAccess", "writeAccess"}
|
||||
}
|
||||
});
|
||||
x.AddSecurityDefinition("HeaderToken",
|
||||
new OpenApiSecurityScheme {Name = "Token", In = ParameterLocation.Header});
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用异常中间价扩展
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseExceptionMiddleware(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseMiddleware<ExceptionMiddleware>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用文档UI
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title">文档标题</param>
|
||||
/// <param name="submitMethods">文档支持的提交方式(如果不指定,默认使用POST)</param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseApiDoc(this IApplicationBuilder builder, string title,
|
||||
params SubmitMethod[] submitMethods)
|
||||
{
|
||||
return builder.UseSwagger(x => x.RouteTemplate = "docs/{documentName}.json").UseSwaggerUI(x =>
|
||||
{
|
||||
x.RoutePrefix = "docs";
|
||||
x.DocumentTitle = title;
|
||||
x.SwaggerEndpoint("/docs/api.json", name: title);
|
||||
x.EnableValidator();
|
||||
if (submitMethods.Length > 0)
|
||||
{
|
||||
x.SupportedSubmitMethods(submitMethods);
|
||||
}
|
||||
else
|
||||
{
|
||||
x.SupportedSubmitMethods(SubmitMethod.Post);
|
||||
}
|
||||
|
||||
x.DisplayRequestDuration();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 同时使用Api文档和异常处理中间件
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title">文档标题</param>
|
||||
/// <param name="submitMethods">API提交方式定义</param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseDocAndException(this IApplicationBuilder builder, string title = "API文档",
|
||||
params SubmitMethod[] submitMethods)
|
||||
{
|
||||
return builder.UseExceptionMiddleware().UseApiDoc(title, submitMethods);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用自定义认证中间件(依赖IDistributedCache)
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseAuthMiddleware(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseMiddleware<AuthMiddleware>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用所有YYApi自定义中间件
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title"></param>
|
||||
/// <param name="submitMethods"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseYYApiMiddleware(this IApplicationBuilder builder, string title = "API文档",
|
||||
params SubmitMethod[] submitMethods)
|
||||
{
|
||||
return builder.UseExceptionMiddleware().UseApiDoc(title, submitMethods).UseMiddleware<AuthMiddleware>();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,85 +0,0 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using Microsoft.Extensions.Caching.Distributed;
|
||||
|
||||
namespace YYApi.Helpers
|
||||
{
|
||||
/// <summary>
|
||||
/// 认证信息获取中间件
|
||||
/// </summary>
|
||||
public class AuthMiddleware
|
||||
{
|
||||
private RequestDelegate Next { get; }
|
||||
|
||||
public AuthMiddleware(RequestDelegate next)
|
||||
{
|
||||
Next = next;
|
||||
}
|
||||
|
||||
public Task Invoke(HttpContext httpContext, IDistributedCache cache)
|
||||
{
|
||||
string token = null;
|
||||
if (httpContext.Request.Headers.ContainsKey("Token"))
|
||||
{
|
||||
token = httpContext.Request.Headers["Token"];
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(token))
|
||||
{
|
||||
var id = cache.GetString(token);
|
||||
if (id != null)
|
||||
{
|
||||
httpContext.Items.Add("LoginId", id);
|
||||
}
|
||||
}
|
||||
|
||||
return Next(httpContext);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 检测登录中间件
|
||||
/// </summary>
|
||||
public class CheckAuthAttribute : ActionFilterAttribute
|
||||
{
|
||||
public override void OnActionExecuting(ActionExecutingContext context)
|
||||
{
|
||||
if (context.HttpContext.Items["LoginId"] == null)
|
||||
{
|
||||
throw new ApiException(401);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 认证助手
|
||||
/// </summary>
|
||||
public class Auth
|
||||
{
|
||||
private IDistributedCache Cache { get; }
|
||||
|
||||
public Auth(IDistributedCache cache)
|
||||
{
|
||||
Cache = cache;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 产生一个Token记录并返回Token
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public string SetId(int id)
|
||||
{
|
||||
var uuid = GetUUID();
|
||||
Cache.SetString(uuid, id.ToString());
|
||||
return uuid;
|
||||
}
|
||||
|
||||
private string GetUUID()
|
||||
{
|
||||
return Guid.NewGuid().ToString();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,65 @@
|
||||
using System;
|
||||
using System.Text.Json;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Caching.Distributed;
|
||||
using SimApi.Communications;
|
||||
|
||||
namespace SimApi.Helpers
|
||||
{
|
||||
/// <summary>
|
||||
/// 认证助手
|
||||
/// </summary>
|
||||
public class SimApiAuth
|
||||
{
|
||||
private IDistributedCache Cache { get; }
|
||||
|
||||
public SimApiAuth(IDistributedCache cache)
|
||||
{
|
||||
Cache = cache;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 产生一个Token记录并返回Token
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <returns></returns>
|
||||
public string Login(int id, string type = "user", string token = null)
|
||||
{
|
||||
return Login(id, new[] { type }, token);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 产生一个Token并记录用户ID角色[多角色]
|
||||
/// </summary>
|
||||
/// <param name="id"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public string Login(int id, string[] type, string uuid = null)
|
||||
{
|
||||
if (uuid == null)
|
||||
{
|
||||
uuid = Guid.NewGuid().ToString();
|
||||
}
|
||||
var loginItem = new SimApiLoginItem
|
||||
{
|
||||
Id = id,
|
||||
Type = type
|
||||
};
|
||||
Cache.SetString(uuid, JsonSerializer.Serialize(loginItem));
|
||||
return uuid;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 退出登陆
|
||||
/// </summary>
|
||||
/// <param name="uuid">登陆标识</param>
|
||||
public void Logout(string uuid)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(uuid))
|
||||
{
|
||||
Cache.Remove(uuid);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
|
||||
namespace SimApi.Helpers
|
||||
{
|
||||
public class SimApiUpload
|
||||
{
|
||||
private string FilePathFolder = "/uploads/";
|
||||
public string FilePath
|
||||
{
|
||||
set
|
||||
{
|
||||
if (!value.StartsWith("/"))
|
||||
{
|
||||
FilePathFolder = $"/{value}";
|
||||
}
|
||||
if (!FilePathFolder.EndsWith("/"))
|
||||
{
|
||||
FilePathFolder += "/";
|
||||
}
|
||||
}
|
||||
get
|
||||
{
|
||||
return FilePathFolder;
|
||||
}
|
||||
}
|
||||
|
||||
private IWebHostEnvironment Env { get; }
|
||||
|
||||
public SimApiUpload(IWebHostEnvironment env)
|
||||
{
|
||||
Env = env;
|
||||
}
|
||||
|
||||
public class SimApiUploadInfo
|
||||
{
|
||||
public string Path { get; set; }
|
||||
public int Size { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 保存base64文件,如果有标头按照标头自动识别
|
||||
/// </summary>
|
||||
/// <param name="base64"></param>
|
||||
/// <param name="ext">扩展名</param>
|
||||
/// <param name="path">存放路径</param>
|
||||
/// <param name="fileName">文件名</param>
|
||||
/// <returns></returns>
|
||||
public SimApiUploadInfo SaveFile(string base64, string ext = null, string path = null, string fileName = null)
|
||||
{
|
||||
byte[] bt;
|
||||
var filePath = FilePath + path;
|
||||
if (fileName == null)
|
||||
{
|
||||
fileName = Guid.NewGuid().ToString();
|
||||
}
|
||||
var baseArr = base64.Split(";");
|
||||
if (baseArr.Length == 2)
|
||||
{
|
||||
var info = baseArr[0].Split(":")[1].Split("/");
|
||||
if (path == null)
|
||||
{
|
||||
filePath += $"{info[0]}/";
|
||||
}
|
||||
if (ext == null)
|
||||
{
|
||||
ext = info[1];
|
||||
}
|
||||
var data = baseArr[1].Split(",");
|
||||
bt = Convert.FromBase64String(data[1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
bt = Convert.FromBase64String(base64);
|
||||
}
|
||||
var fn = fileName + (string.IsNullOrEmpty(ext) ? string.Empty : $".{ext}");
|
||||
return WriteFile(filePath, fn, bt);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 把数据写入文件
|
||||
/// </summary>
|
||||
/// <param name="filePath"></param>
|
||||
/// <param name="fileName"></param>
|
||||
/// <param name="data"></param>
|
||||
/// <returns></returns>
|
||||
public SimApiUploadInfo WriteFile(string filePath, string fileName, byte[] data)
|
||||
{
|
||||
var realPath = Directory.GetCurrentDirectory() + "/wwwroot" + filePath;
|
||||
if (!Directory.Exists(realPath))
|
||||
{
|
||||
Directory.CreateDirectory(realPath);
|
||||
}
|
||||
File.WriteAllBytes(realPath + fileName, data);
|
||||
return new SimApiUploadInfo
|
||||
{
|
||||
Path = filePath + fileName,
|
||||
Size = data.Length
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -3,9 +3,9 @@ using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace YYApi.Helpers
|
||||
namespace SimApi.Helpers
|
||||
{
|
||||
public static class Util
|
||||
public static class SimApiUtil
|
||||
{
|
||||
/// <summary>
|
||||
/// 检测手机号是否正确
|
||||
@@ -0,0 +1,41 @@
|
||||
using System.Text.Json;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.Extensions.Caching.Distributed;
|
||||
using SimApi.Communications;
|
||||
|
||||
namespace SimApi.Middlewares
|
||||
{
|
||||
/// <summary>
|
||||
/// 认证信息获取中间件
|
||||
/// </summary>
|
||||
public class SimApiAuthMiddleware
|
||||
{
|
||||
private RequestDelegate Next { get; }
|
||||
|
||||
public SimApiAuthMiddleware(RequestDelegate next)
|
||||
{
|
||||
Next = next;
|
||||
}
|
||||
|
||||
public Task Invoke(HttpContext httpContext, IDistributedCache cache)
|
||||
{
|
||||
string token = null;
|
||||
if (httpContext.Request.Headers.ContainsKey("Token"))
|
||||
{
|
||||
token = httpContext.Request.Headers["Token"];
|
||||
}
|
||||
|
||||
if (!string.IsNullOrEmpty(token))
|
||||
{
|
||||
var login = cache.GetString(token);
|
||||
if (login != null)
|
||||
{
|
||||
httpContext.Items.Add("LoginInfo", JsonSerializer.Deserialize<SimApiLoginItem>(login));
|
||||
}
|
||||
}
|
||||
|
||||
return Next(httpContext);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,21 +1,21 @@
|
||||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using YYApi.Communications;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using SimApi.Communications;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using SimApi.Exceptions;
|
||||
|
||||
namespace YYApi.Helpers
|
||||
namespace SimApi.Middlewares
|
||||
{
|
||||
/// <summary>
|
||||
/// 异常处理中间件
|
||||
/// </summary>
|
||||
public class ExceptionMiddleware
|
||||
public class SimApiExceptionMiddleware
|
||||
{
|
||||
private RequestDelegate Next { get; }
|
||||
private ILogger<ExceptionMiddleware> Log { get; }
|
||||
private ILogger<SimApiExceptionMiddleware> Log { get; }
|
||||
|
||||
public ExceptionMiddleware(RequestDelegate next, ILogger<ExceptionMiddleware> log)
|
||||
public SimApiExceptionMiddleware(RequestDelegate next, ILogger<SimApiExceptionMiddleware> log)
|
||||
{
|
||||
Log = log;
|
||||
Next = next;
|
||||
@@ -23,14 +23,31 @@ namespace YYApi.Helpers
|
||||
|
||||
public async Task InvokeAsync(HttpContext context)
|
||||
{
|
||||
var response = new BaseResponse();
|
||||
if (context.Request.Headers.ContainsKey("Query-Id"))
|
||||
{
|
||||
context.Response.Headers["Query-Id"] = context.Request.Headers["Query-Id"];
|
||||
}
|
||||
|
||||
var response = new SimApiBaseResponse();
|
||||
try
|
||||
{
|
||||
await Next(context);
|
||||
if (context.Response.StatusCode != 200)
|
||||
{
|
||||
throw new SimApiException(context.Response.StatusCode);
|
||||
}
|
||||
}
|
||||
catch (ApiException ex)
|
||||
catch (SimApiException ex)
|
||||
{
|
||||
response.SetCodeMsg(ex.Code, ex.Message);
|
||||
if (string.IsNullOrEmpty(ex.Message))
|
||||
{
|
||||
response.SetCode(ex.Code);
|
||||
}
|
||||
else
|
||||
{
|
||||
response.SetCodeMsg(ex.Code, ex.Message);
|
||||
}
|
||||
|
||||
ErrorResponse(context, response);
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -47,25 +64,11 @@ namespace YYApi.Helpers
|
||||
/// </summary>
|
||||
/// <param name="context"></param>
|
||||
/// <param name="response"></param>
|
||||
private void ErrorResponse(HttpContext context, BaseResponse response)
|
||||
private void ErrorResponse(HttpContext context, SimApiBaseResponse response)
|
||||
{
|
||||
context.Response.StatusCode = 200;
|
||||
context.Response.Headers.Add("Content-Type", "application/json");
|
||||
context.Response.WriteAsync(response.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// Api错误捕获异常
|
||||
/// </summary>
|
||||
public class ApiException : Exception
|
||||
{
|
||||
public int Code { get; }
|
||||
|
||||
public ApiException(int code, string message = "") : base(message)
|
||||
{
|
||||
Code = code;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,5 +2,15 @@
|
||||
"iisSettings": {
|
||||
"windowsAuthentication": false,
|
||||
"anonymousAuthentication": true
|
||||
},
|
||||
"profiles": {
|
||||
"YYApi": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
},
|
||||
"applicationUrl": "https://localhost:5001;http://localhost:5000"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,6 @@
|
||||
# YYApi 基于Asp.net Core 3的一个基础辅助包
|
||||
# YYApi 基于Asp.net Core 3/5的一个基础辅助包
|
||||
|
||||

|
||||
|
||||
### 包含了以下组件:
|
||||
|
||||
@@ -7,15 +9,16 @@
|
||||
|
||||
```C#
|
||||
using Models;
|
||||
using SimApi.Controllers;
|
||||
|
||||
namespace Controllers
|
||||
{
|
||||
public class BaseController : YYApi.Controllers.BaseController
|
||||
public class BaseController : SimApiBaseController
|
||||
{
|
||||
/// <summary>
|
||||
/// 获取登录用户信息
|
||||
/// </summary>
|
||||
protected User LoginInfo => (User) HttpContext.Items["LoginInfo"];
|
||||
protected SimApiLoginInfoItem LoginInfo => (SimApiLoginInfoItem) HttpContext.Items["LoginInfo"];
|
||||
}
|
||||
}
|
||||
```
|
||||
@@ -25,32 +28,32 @@ namespace Controllers
|
||||
```C#
|
||||
#Startup.cs
|
||||
|
||||
services.AddApiDoc("文档名称", "文档描述");
|
||||
services.AddSimApiDoc("文档名称", "文档描述");
|
||||
|
||||
app.UseApiDoc("名称",SubmitMethod[])
|
||||
app.UseSimApiDoc("名称",SubmitMethod[])
|
||||
|
||||
#控制器中可以直接使用特性
|
||||
|
||||
[ApiDoc("分组","名称")]
|
||||
[SimApiDoc("分组","名称")]
|
||||
```
|
||||
|
||||
3. 简单的基于Redis的登录TOKEN服务
|
||||
|
||||
```C#
|
||||
#Startup.cs
|
||||
service.AddAuth();
|
||||
service.AddSimApiAuth();
|
||||
```
|
||||
添加时候, 可以从DI中获取 Auth 类,调用 Auth.SetId(int) 将用户ID和生成的Token绑定,本方法返回缓存中的Key名称
|
||||
添加时候, 可以从DI中获取 Auth 类,调用 Auth.Set(int,string) 将用户ID/类型和生成的Token绑定,本方法返回缓存中的Key名称
|
||||
|
||||
```C#
|
||||
#Startup.cs
|
||||
app.UseAuthMiddleware();
|
||||
app.UseSimApiAuth();
|
||||
```
|
||||
调用本中间件,然后再需要登录认证的地方,使用 [CheckAuth] 特性,即可完成检测登录相关的操作,
|
||||
调用本中间件,然后再需要登录认证的地方,使用 [YYAuth] 特性,即可完成检测登录相关的操作,
|
||||
如果需要获取用户的ID, 只需要 直接使用 LoginId 属性即可获取
|
||||
|
||||
4. 统一返回
|
||||
所有Response 均需要继承 BaseResponse类
|
||||
所有Response 均需要继承 SimApiBaseResponse类
|
||||
|
||||
|
||||
5. 异常处理
|
||||
@@ -58,5 +61,5 @@ app.UseAuthMiddleware();
|
||||
|
||||
```C#
|
||||
#Startup.cs
|
||||
app.UseExceptionMiddleware();
|
||||
app.UseSimApiException();
|
||||
```
|
||||
@@ -1,28 +1,34 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
||||
<TargetFramework>netcoreapp5.0</TargetFramework>
|
||||
<OutputType>Library</OutputType>
|
||||
<PackOnBuild>true</PackOnBuild>
|
||||
<Version>0.1.0</Version>
|
||||
<Authors>xRain@YYTech</Authors>
|
||||
<Version>0.2.3</Version>
|
||||
<Authors>xRain@SimcuTeam</Authors>
|
||||
<Description>AspNetCore一个方便的API文档,捕获异常,统一输入输出的API类库</Description>
|
||||
<PackageId>YY-Tech.YYApi</PackageId>
|
||||
<PackageId>Simcu.SimApi</PackageId>
|
||||
<IsPackable>true</IsPackable>
|
||||
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
|
||||
<IncludeSymbols>true</IncludeSymbols>
|
||||
<ReleaseVersion>5.0.0</ReleaseVersion>
|
||||
<SynchReleaseVersion>false</SynchReleaseVersion>
|
||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||
<PackageVersion>5.0.2</PackageVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(RunConfiguration)' == 'YYApi' " />
|
||||
<ItemGroup>
|
||||
<Folder Include="Helpers\" />
|
||||
<Folder Include="Communications\" />
|
||||
<Folder Include="Controllers\" />
|
||||
<Folder Include="Middlewares\" />
|
||||
<Folder Include="Attributes\" />
|
||||
<Folder Include="Exceptions\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Content Remove="Properties\launchSettings.json" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.0.0-rc4" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="5.0.0-rc4" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="5.6.3" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="5.6.3" />
|
||||
</ItemGroup>
|
||||
<ProjectExtensions>
|
||||
<MonoDevelop>
|
||||
@@ -0,0 +1,190 @@
|
||||
using System;
|
||||
using SimApi.Helpers;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.OpenApi.Models;
|
||||
using Swashbuckle.AspNetCore.SwaggerUI;
|
||||
using SimApi.Middlewares;
|
||||
using Microsoft.AspNetCore.HttpOverrides;
|
||||
|
||||
namespace SimApi
|
||||
{
|
||||
/// <summary>
|
||||
/// 加入系统的扩展信息
|
||||
/// </summary>
|
||||
public static class Extensions
|
||||
{
|
||||
public static string DocumentTitle = "";
|
||||
public static string DocumentDescription = "";
|
||||
|
||||
//**********快捷添加**************
|
||||
|
||||
/// <summary>
|
||||
/// 添加整个SimAPI,同时增加CORS规则
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title"></param>
|
||||
/// <param name="description"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddSimApi(this IServiceCollection builder, string title,
|
||||
string description = null)
|
||||
{
|
||||
return builder.AddSimApiAuth().AddSimApiDoc(title, description).AddCors().AddSimApiUpload().Configure<ForwardedHeadersOptions>(options =>
|
||||
{
|
||||
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor |
|
||||
ForwardedHeaders.XForwardedProto;
|
||||
// Only loopback proxies are allowed by default.
|
||||
// Clear that restriction because forwarders are enabled by explicit
|
||||
// configuration.
|
||||
options.KnownNetworks.Clear();
|
||||
options.KnownProxies.Clear();
|
||||
}); ;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用所有SimApi自定义中间件
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title"></param>
|
||||
/// <param name="staticFileroot"></param>
|
||||
/// <param name="submitMethods"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApi(this IApplicationBuilder builder, params SubmitMethod[] submitMethods)
|
||||
{
|
||||
return builder.UseSimApiException().UseSimApiDoc(submitMethods).UseMiddleware<SimApiAuthMiddleware>().UseCors(x => x.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin()).UseSimApiUpload().UseForwardedHeaders();
|
||||
}
|
||||
|
||||
|
||||
|
||||
//*********组件快捷方式*************
|
||||
|
||||
/// <summary>
|
||||
/// 添加自定义授权认证中间价
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddSimApiAuth(this IServiceCollection builder)
|
||||
{
|
||||
return builder.AddScoped<SimApiAuth>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加Base64上传组件
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddSimApiUpload(this IServiceCollection builder)
|
||||
{
|
||||
return builder.AddSingleton<SimApiUpload>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加Api文档服务
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title">文档标题</param>
|
||||
/// <param name="description">文档描述</param>
|
||||
/// <returns></returns>
|
||||
public static IServiceCollection AddSimApiDoc(this IServiceCollection builder, string title,
|
||||
string description = null)
|
||||
{
|
||||
DocumentTitle = title;
|
||||
DocumentDescription = description;
|
||||
return builder.AddSwaggerGen(x =>
|
||||
{
|
||||
x.SwaggerDoc("api", new OpenApiInfo { Title = DocumentTitle, Description = DocumentDescription });
|
||||
x.EnableAnnotations();
|
||||
x.AddSecurityRequirement(new OpenApiSecurityRequirement
|
||||
{
|
||||
{
|
||||
new OpenApiSecurityScheme
|
||||
{
|
||||
Reference = new OpenApiReference {Type = ReferenceType.SecurityScheme, Id = "HeaderToken"}
|
||||
},
|
||||
new[] {"readAccess", "writeAccess"}
|
||||
}
|
||||
});
|
||||
x.AddSecurityDefinition("HeaderToken",
|
||||
new OpenApiSecurityScheme { Name = "Token", In = ParameterLocation.Header });
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 使用异常中间价扩展
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApiException(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseMiddleware<SimApiExceptionMiddleware>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 配置上传组件必须
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApiUpload(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseStaticFiles(new StaticFileOptions
|
||||
{
|
||||
DefaultContentType = "application/x-msdownload",
|
||||
ServeUnknownFileTypes = true
|
||||
});
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用文档UI
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title">文档标题</param>
|
||||
/// <param name="submitMethods">文档支持的提交方式(如果不指定,默认使用POST)</param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApiDoc(this IApplicationBuilder builder, params SubmitMethod[] submitMethods)
|
||||
{
|
||||
return builder.UseSwagger(x => x.RouteTemplate = "docs/{documentName}.json").UseSwaggerUI(x =>
|
||||
{
|
||||
x.RoutePrefix = "docs";
|
||||
x.DocumentTitle = DocumentTitle;
|
||||
x.SwaggerEndpoint("/docs/api.json", name: DocumentTitle);
|
||||
x.EnableValidator();
|
||||
if (submitMethods.Length > 0)
|
||||
{
|
||||
x.SupportedSubmitMethods(submitMethods);
|
||||
}
|
||||
else
|
||||
{
|
||||
x.SupportedSubmitMethods(SubmitMethod.Post);
|
||||
}
|
||||
|
||||
x.DisplayRequestDuration();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 同时使用Api文档和异常处理中间件
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <param name="title">文档标题</param>
|
||||
/// <param name="submitMethods">API提交方式定义</param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApiDocEx(this IApplicationBuilder builder, params SubmitMethod[] submitMethods)
|
||||
{
|
||||
return builder.UseSimApiException().UseSimApiDoc(submitMethods);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 使用自定义认证中间件(依赖IDistributedCache)
|
||||
/// </summary>
|
||||
/// <param name="builder"></param>
|
||||
/// <returns></returns>
|
||||
public static IApplicationBuilder UseSimApiAuth(this IApplicationBuilder builder)
|
||||
{
|
||||
return builder.UseMiddleware<SimApiAuthMiddleware>();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user