22 Commits
5.1 ... 5.2

Author SHA1 Message Date
yubaolee
c0d47e37bf miniprofiler忽略swagger路径 2021-05-26 01:14:41 +08:00
yubaolee
c559f33037 fix issue #I3SKUV 可以正常在swagger中使用mini profiler 2021-05-26 00:09:31 +08:00
yubaolee
64d55568d1 revert to net 5.0 2021-05-25 00:55:54 +08:00
yubaolee
452de01fb8 fix #I3SKUV 增加API和EF执行效率的监控
新增流程修改接口
增加启动及撤销判定
2021-05-25 00:49:12 +08:00
李玉宝
d78b60764c !16 修复运行单个单元测试时,获取OpenAuth.WebApi配置文件路径异常的问题。
Merge pull request !16 from sesamefly/N/A
2021-05-14 23:06:11 +08:00
yubaolee
c4f0b34dd6 fix issue #I3QUV1 appsettings增加配置启动地址和端口 2021-05-14 01:58:36 +08:00
sesamefly
21f25fc42d 修复运行单个单元测试时,获取OpenAuth.WebApi配置文件路径异常的问题。 2021-05-13 10:48:53 +08:00
李玉宝
35a13a4772 !15 update OpenAuth.App/Test/TestBase.cs.
Merge pull request !15 from sesamefly/N/A
2021-05-12 00:46:56 +08:00
sesamefly
9cb5214a06 update OpenAuth.App/Test/TestBase.cs. 2021-05-11 14:30:23 +08:00
yubaolee
75ceea1652 增加自定义模态验证异常返回信息 2021-05-09 21:07:04 +08:00
yubaolee
d9a500b3b2 delete log folder 2021-05-09 01:22:31 +08:00
yubaolee
cd211c05d3 fix issue #I3QBZI 2021-05-09 00:02:28 +08:00
李玉宝
88e2015a11 !12 优化API增加日志记录和友好返回
Merge pull request !12 from wangsl_sl/main
2021-05-08 16:49:30 +08:00
wangsl
781097f325 优化:
1.增加全站api 文本日志记录,后期可扩展日志记录到ES等搜索器中
2.禁用.net自动模态验证 , 采用系统全局异常捕获机制,增加友好提示
2021-05-08 16:29:11 +08:00
yubaolee
a681549bd8 fix issue #I3QBZI
add swagger example value
2021-05-08 12:05:51 +08:00
yubaolee
2834a62fc7 fix issue #I3ODI5 swagger增加分组的功能
fix issue #I3PE3R 会签节点异常,提示'-1' was not present in ...
fix CodeSmith生成的后端代码报错 https://gitee.com/yubaolee/OpenAuth.Core/issues/I3OXJZ
2021-05-07 23:38:53 +08:00
yubaolee
4148427f1a fix #I3O97D 站点启动时自动运行状态为【正在运行】的定时任务;
fix #I3ODHI 增加存储过程调用;
2021-04-28 10:20:24 +08:00
yubaolee
785d784759 根据最新的项目结构调整代码生成器 2021-04-27 00:10:19 +08:00
yubaolee
0810b0b9c0 fix issue #I3NU1A
增加流程运行时可以选择执行人或角色。包括流程审批、流程节点创建时,开始节点的下一个节点处理
2021-04-26 12:25:37 +08:00
yubaolee
65e42ed2c3 fix issue #I3M9L9 2021-04-23 15:46:48 +08:00
李玉宝
3821a2f111 update README.md. 2021-04-22 01:21:16 +08:00
yubaolee
f9134a3274 update doc 2021-04-21 18:18:11 +08:00
81 changed files with 1778 additions and 680 deletions

View File

@@ -1,12 +1,36 @@
## v5.1 (未发布版本)
## v5.2 (未发布版本)
- **新特性**
- [新增] 增加流程实例可以选择用户,而不是通过流程设计的方式[#I1W8AV](https://gitee.com/dotnetchina/OpenAuth.Net/issues/I1W8AV)
- **突破性变化**
- **问题修复**
- **其他更改**
- **不做实现**
---
## v5.1 (当前版本)
- **新特性**
- [新增] 支持同时配置多个类型数据库的连接字符串详见http://doc.openauth.me/core/multidbs.html
- [新增] 新增Oracle数据库驱动;
- [新增] 新增流程召回功能;
- [新增] 调整APP层文件结构按功能划分
- **突破性变化**
- [调整] 优化生成实体在生成实体后自动在OpenAuthDBContext中新增DbSet
- [调整] 配置文件中可以配置连接字符串对应的数据库类型
- **问题修复**

View File

@@ -180,7 +180,7 @@ Category="1.Database" Description="可以选择一个或多个表使用Ctrl
foreach(TableSchema table in tables)
{
string generatedFile = Path.GetFullPath(directory) + "OpenAuth.App\\"+ table.Name + "App.cs";
string generatedFile = Path.GetFullPath(directory) + "OpenAuth.App\\"+ table.Name +"\\"+ table.Name + "App.cs";
generatedClass.Table = table;
//generatedClass.Entity = entity;
Response.WriteLine("已生成"+generatedFile);
@@ -196,7 +196,7 @@ Category="1.Database" Description="可以选择一个或多个表使用Ctrl
this.CopyPropertiesTo(generatedClass);
foreach(TableSchema table in tables)
{
string generatedFile = Path.GetFullPath(directory) + "OpenAuth.App\\Request\\Query"+ table.Name + "ListReq.cs";
string generatedFile = Path.GetFullPath(directory) + "OpenAuth.App\\"+ table.Name +"\\Request\\Query"+ table.Name + "ListReq.cs";
generatedClass.ModuleName = table.Name;
Response.WriteLine("已生成"+generatedFile);
generatedClass.RenderToFile(generatedFile, generatedFile, true);
@@ -207,7 +207,7 @@ Category="1.Database" Description="可以选择一个或多个表使用Ctrl
this.CopyPropertiesTo(modifyReqGenerateClass);
foreach(TableSchema table in tables)
{
string generatedFile = Path.GetFullPath(directory) + "OpenAuth.App\\Request\\AddOrUpdate"+ table.Name + "Req.cs";
string generatedFile = Path.GetFullPath(directory) + "OpenAuth.App\\"+ table.Name +"\\Request\\AddOrUpdate"+ table.Name + "Req.cs";
modifyReqGenerateClass.Table = table;
Response.WriteLine("已生成"+generatedFile);
modifyReqGenerateClass.RenderToFile(generatedFile, generatedFile, true);

View File

@@ -9,13 +9,13 @@ Description: Create a list of properties from a database table
<%@ Import Namespace="SchemaExplorer" %>
<%@ Property Name="Table"
Type="SchemaExplorer.TableSchema" %>
<%@ Property Name="HeaderModel"
Type="System.Boolean"
Category="1.Database"
Default="true"
Description="是否为启用头表模式,即类似‘入库订单’界面" %>
<%@ Assembly Src="../Web/Util.cs" %>
<%@ Import Namespace="Util" %>
using System;
using System.Linq;
using Infrastructure;
@@ -25,14 +25,11 @@ using OpenAuth.App.Response;
using OpenAuth.Repository;
using OpenAuth.Repository.Domain;
using OpenAuth.Repository.Interface;
namespace OpenAuth.App
{
public class <%=Table.Name%>App : BaseStringApp<<%=Table.Name%>, OpenAuthDBContext>
{
private RevelanceManagerApp _revelanceApp;
/// <summary>
/// 加载列表
/// </summary>
@@ -43,23 +40,17 @@ namespace OpenAuth.App
{
throw new CommonException("登录已过期", Define.INVALID_TOKEN);
}
var properties = loginContext.GetProperties("<%=Table.Name%>");
if (properties == null || properties.Count == 0)
{
throw new Exception("当前登录用户没有访问该模块字段的权限,请联系管理员配置");
}
var result = new TableData();
var objs = UnitWork.Find<<%=Table.Name%>>(null);
if (!string.IsNullOrEmpty(request.key))
{
objs = objs.Where(u => u.Id.Contains(request.key));
}
var propertyStr = string.Join(',', properties.Select(u => u.Key));
result.columnHeaders = properties;
result.data = objs.OrderBy(u => u.Id)
@@ -68,16 +59,14 @@ namespace OpenAuth.App
result.count = objs.Count();
return result;
}
<%
if(Table.Name.Contains("Tbl") && (!Table.Name.Contains("Dtbl")) && this.HeaderModel){
var dtblName = Table.Name.Replace("Tbl","Dtbl"); //明细表的表名
%>
public void Add(AddOrUpdate<%=Table.Name%>Req req)
{
var obj = req.MapTo<<%=Table.Name%>>();
//todo:补充或调整自己需要的字段
//todo:根据自己的业务场景,补充或调整字段
obj.CreateTime = DateTime.Now;
var user = _auth.GetCurrentUser().User;
obj.CreateUserId = user.Id;
@@ -91,14 +80,11 @@ namespace OpenAuth.App
_<%=dtblName%>App.AddNoSave(detail);
}
}
UnitWork.Save();
}
public void Update(AddOrUpdate<%=Table.Name%>Req obj)
{
var user = _auth.GetCurrentUser().User;
if (obj.<%=dtblName%>Reqs != null && obj.<%=dtblName%>Reqs.Any())
{
//id为空的添加
@@ -107,7 +93,6 @@ namespace OpenAuth.App
detail.ForeignKeyId = obj.Id; //todo:调整自己的明细表外键
_<%=dtblName%>App.AddNoSave(detail);
}
//id比数据库少的删除
var containids = obj.<%=dtblName%>Reqs.Select(u => u.Id)
.Where(u =>!string.IsNullOrEmpty(u)).ToList();
@@ -115,72 +100,57 @@ namespace OpenAuth.App
{
UnitWork.Delete<<%=dtblName%>>(u =>(!containids.Contains(u.Id)) && u.ForeignKeyId == obj.Id); //todo:调整自己的明细表外键
}
//更新id相同的
foreach (var detail in obj.<%=dtblName%>Reqs.Where(u =>!string.IsNullOrEmpty(u.Id)))
{
_<%=dtblName%>App.Update(detail);
}
}
UnitWork.Update<<%=Table.Name%>>(u => u.Id == obj.Id, u => new <%=Table.Name%>
{
<% foreach(ColumnSchema p in Table.Columns) {
if(p.IsPrimaryKeyMember) continue;
%>
<%= p.Name%> = obj.<%= p.Name%>,
<% } %>
UpdateTime = DateTime.Now,
UpdateUserId = user.Id,
UpdateUserName = user.Name
//todo:补充或调整自己需要的字段
});
<%CreateUpdate();%>
UnitWork.Save();
}
<%
}else{ %>
public void Add(AddOrUpdate<%=Table.Name%>Req req)
{
var obj = req.MapTo<<%=Table.Name%>>();
//todo:补充或调整自己需要的字段
obj.CreateTime = DateTime.Now;
var user = _auth.GetCurrentUser().User;
obj.CreateUserId = user.Id;
obj.CreateUserName = user.Name;
//todo:根据自己的业务场景,补充或调整字段
//比如:obj.CreateTime = DateTime.Now;
// var user = _auth.GetCurrentUser().User;
// obj.CreateUserId = user.Id;
// obj.CreateUserName = user.Name;
Repository.Add(obj);
}
public void Update(AddOrUpdate<%=Table.Name%>Req obj)
{
var user = _auth.GetCurrentUser().User;
UnitWork.Update<<%=Table.Name%>>(u => u.Id == obj.Id, u => new <%=Table.Name%>
{
<% foreach(ColumnSchema p in Table.Columns) {
if(p.IsPrimaryKeyMember) continue;
%>
<%= p.Name%> = obj.<%= p.Name%>,
<% } %>
UpdateTime = DateTime.Now,
UpdateUserId = user.Id,
UpdateUserName = user.Name
//todo:补充或调整自己需要的字段
});
<%CreateUpdate();%>
}
<%
}
%>
public <%=Table.Name%>App(IUnitWork<OpenAuthDBContext> unitWork, IRepository<<%=Table.Name%>, OpenAuthDBContext> repository,
RevelanceManagerApp app, IAuth auth) : base(unitWork, repository,auth)
{
_revelanceApp = app;
}
}
}
}
<script runat="template">
/// <summary>
/// 创建更新字段
/// </summary>
public void CreateUpdate() {
var updatestr = Tools.CreateBlank(1) + "UnitWork.Update<" + Table.Name + ">(u => u.Id == obj.Id, u => new " + Table.Name + "\r\n";
updatestr +=Tools.CreateBlank(1) + "{\r\n";
var columnstr = "";
foreach (ColumnSchema p in Table.Columns) {
if (p.IsPrimaryKeyMember) continue ;
columnstr += Tools.CreateBlank(2)+ p.Name + " = obj." + p.Name + ", \r\n";
}
columnstr = columnstr.Substring(0, columnstr.Length - 4); //删除最后一个逗号
updatestr += columnstr;
updatestr += "\r\n" +Tools.CreateBlank(2) +"//todo:根据自己的业务场景,补充或调整字段";
updatestr += "\r\n" +Tools.CreateBlank(1) +"});";
Response.WriteLine(updatestr);
}
</script>

View File

@@ -28,7 +28,9 @@ namespace OpenAuth.WebApi.Controllers
{
private readonly <%=ModuleName%>App _app;
//获取详情
/// <summary>
/// //获取详情
/// </summary>
[HttpGet]
public Response<<%=ModuleName%>> Get(string id)
{
@@ -46,7 +48,9 @@ namespace OpenAuth.WebApi.Controllers
return result;
}
//添加
/// <summary>
/// 添加
/// </summary>
[HttpPost]
public Response Add(AddOrUpdate<%=ModuleName%>Req obj)
{
@@ -65,7 +69,9 @@ namespace OpenAuth.WebApi.Controllers
return result;
}
//修改
/// <summary>
/// 修改
/// </summary>
[HttpPost]
public Response Update(AddOrUpdate<%=ModuleName%>Req obj)
{

View File

@@ -55,7 +55,7 @@ namespace OpenAuth.App.Request
public <%= p.SystemType.ToNullableType(p.AllowDBNull == true) %> <%= p.Name%> { get; set; }
<% } %>
//todo:添加自己的请求字段
//todo:根据自己的业务场景添加需要的字段
<%
if(Table.Name.Contains("Tbl") && (!Table.Name.Contains("Dtbl")) && this.HeaderModel){
var dtblName = Table.Name.Replace("Tbl","Dtbl"); //明细表的表名

View File

@@ -12,6 +12,6 @@ namespace OpenAuth.App.Request
{
public class Query<%=ModuleName%>ListReq : PageReq
{
//todo:添加自己的请求字段
//todo:根据自己的业务场景添加需要的字段
}
}

View File

@@ -36,9 +36,13 @@ namespace OpenAuth.Mvc.Controllers
return View();
}
//添加或修改
/// <summary>
/// MVC界面添加
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
[HttpPost]
public string Add(<%=ModuleName%> obj)
public string Add(AddOrUpdate<%=ModuleName%>Req obj)
{
try
{
@@ -53,9 +57,13 @@ namespace OpenAuth.Mvc.Controllers
return JsonHelper.Instance.Serialize(Result);
}
//添加或修改
/// <summary>
/// MVC界面修改
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
[HttpPost]
public string Update(<%=ModuleName%> obj)
public string Update(AddOrUpdate<%=ModuleName%>Req obj)
{
try
{

View File

@@ -20,5 +20,20 @@ namespace Util{
return SourceTable.Columns.Contains("ParentId")
|| SourceTable.Columns.Contains("CascadeId") ;
}
public static string CreateBlank(int level){
if(level == 1){
return " ";
}
else{
var twoblanks = " ";
for (int i = level-1; i > 1; i--)
{
twoblanks +=twoblanks;
}
return CreateBlank(1) + twoblanks;
}
}
}
}

View File

@@ -0,0 +1,17 @@
namespace Infrastructure.Const
{
/// <summary>
/// 定时任务状态
/// </summary>
public enum JobStatus
{
/// <summary>
/// 未启动
/// </summary>
NotRun,
/// <summary>
/// 正在运行
/// </summary>
Running
}
}

View File

@@ -0,0 +1,412 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Infrastructure.Extensions;
namespace Infrastructure.Database
{
/// <summary>
/// 数据库数据转换拓展
/// </summary>
public static class DbDataConvertExtensions
{
/// <summary>
/// 将 DataTable 转 List 集合
/// </summary>
/// <typeparam name="T">返回值类型</typeparam>
/// <param name="dataTable">DataTable</param>
/// <returns>List{T}</returns>
public static List<T> ToList<T>(this DataTable dataTable)
{
return dataTable.ToList(typeof(List<T>)) as List<T>;
}
/// <summary>
/// 将 DataTable 转 List 集合
/// </summary>
/// <typeparam name="T">返回值类型</typeparam>
/// <param name="dataTable">DataTable</param>
/// <returns>List{T}</returns>
public static async Task<List<T>> ToListAsync<T>(this DataTable dataTable)
{
var list = await dataTable.ToListAsync(typeof(List<T>));
return list as List<T>;
}
/// <summary>
/// 将 DataSet 转 元组
/// </summary>
/// <typeparam name="T1">元组元素类型</typeparam>
/// <param name="dataSet">DataSet</param>
/// <returns>元组类型</returns>
public static List<T1> ToList<T1>(this DataSet dataSet)
{
var tuple = dataSet.ToList(typeof(List<T1>));
return tuple[0] as List<T1>;
}
/// <summary>
/// 将 DataSet 转 元组
/// </summary>
/// <typeparam name="T1">元组元素类型</typeparam>
/// <typeparam name="T2">元组元素类型</typeparam>
/// <param name="dataSet">DataSet</param>
/// <returns>元组类型</returns>
public static (List<T1> list1, List<T2> list2) ToList<T1, T2>(this DataSet dataSet)
{
var tuple = dataSet.ToList(typeof(List<T1>), typeof(List<T2>));
return (tuple[0] as List<T1>, tuple[1] as List<T2>);
}
/// <summary>
/// 将 DataSet 转 元组
/// </summary>
/// <typeparam name="T1">元组元素类型</typeparam>
/// <typeparam name="T2">元组元素类型</typeparam>
/// <typeparam name="T3">元组元素类型</typeparam>
/// <param name="dataSet">DataSet</param>
/// <returns>元组类型</returns>
public static (List<T1> list1, List<T2> list2, List<T3> list3) ToList<T1, T2, T3>(this DataSet dataSet)
{
var tuple = dataSet.ToList(typeof(List<T1>), typeof(List<T2>), typeof(List<T3>));
return (tuple[0] as List<T1>, tuple[1] as List<T2>, tuple[2] as List<T3>);
}
/// <summary>
/// 将 DataSet 转 元组
/// </summary>
/// <typeparam name="T1">元组元素类型</typeparam>
/// <typeparam name="T2">元组元素类型</typeparam>
/// <typeparam name="T3">元组元素类型</typeparam>
/// <typeparam name="T4">元组元素类型</typeparam>
/// <param name="dataSet">DataSet</param>
/// <returns>元组类型</returns>
public static (List<T1> list1, List<T2> list2, List<T3> list3, List<T4> list4) ToList<T1, T2, T3, T4>(this DataSet dataSet)
{
var tuple = dataSet.ToList(typeof(List<T1>), typeof(List<T2>), typeof(List<T3>), typeof(List<T4>));
return (tuple[0] as List<T1>, tuple[1] as List<T2>, tuple[2] as List<T3>, tuple[3] as List<T4>);
}
/// <summary>
/// 将 DataSet 转 元组
/// </summary>
/// <typeparam name="T1">元组元素类型</typeparam>
/// <typeparam name="T2">元组元素类型</typeparam>
/// <typeparam name="T3">元组元素类型</typeparam>
/// <typeparam name="T4">元组元素类型</typeparam>
/// <typeparam name="T5">元组元素类型</typeparam>
/// <param name="dataSet">DataSet</param>
/// <returns>元组类型</returns>
public static (List<T1> list1, List<T2> list2, List<T3> list3, List<T4> list4, List<T5> list5) ToList<T1, T2, T3, T4, T5>(this DataSet dataSet)
{
var tuple = dataSet.ToList(typeof(List<T1>), typeof(List<T2>), typeof(List<T3>), typeof(List<T4>), typeof(List<T5>));
return (tuple[0] as List<T1>, tuple[1] as List<T2>, tuple[2] as List<T3>, tuple[3] as List<T4>, tuple[4] as List<T5>);
}
/// <summary>
/// 将 DataSet 转 元组
/// </summary>
/// <typeparam name="T1">元组元素类型</typeparam>
/// <typeparam name="T2">元组元素类型</typeparam>
/// <typeparam name="T3">元组元素类型</typeparam>
/// <typeparam name="T4">元组元素类型</typeparam>
/// <typeparam name="T5">元组元素类型</typeparam>
/// <typeparam name="T6">元组元素类型</typeparam>
/// <param name="dataSet">DataSet</param>
/// <returns>元组类型</returns>
public static (List<T1> list1, List<T2> list2, List<T3> list3, List<T4> list4, List<T5> list5, List<T6> list6) ToList<T1, T2, T3, T4, T5, T6>(this DataSet dataSet)
{
var tuple = dataSet.ToList(typeof(List<T1>), typeof(List<T2>), typeof(List<T3>), typeof(List<T4>), typeof(List<T5>), typeof(List<T6>));
return (tuple[0] as List<T1>, tuple[1] as List<T2>, tuple[2] as List<T3>, tuple[3] as List<T4>, tuple[4] as List<T5>, tuple[5] as List<T6>);
}
/// <summary>
/// 将 DataSet 转 元组
/// </summary>
/// <typeparam name="T1">元组元素类型</typeparam>
/// <typeparam name="T2">元组元素类型</typeparam>
/// <typeparam name="T3">元组元素类型</typeparam>
/// <typeparam name="T4">元组元素类型</typeparam>
/// <typeparam name="T5">元组元素类型</typeparam>
/// <typeparam name="T6">元组元素类型</typeparam>
/// <typeparam name="T7">元组元素类型</typeparam>
/// <param name="dataSet">DataSet</param>
/// <returns>元组类型</returns>
public static (List<T1> list1, List<T2> list2, List<T3> list3, List<T4> list4, List<T5> list5, List<T6> list6, List<T7> list7) ToList<T1, T2, T3, T4, T5, T6, T7>(this DataSet dataSet)
{
var tuple = dataSet.ToList(typeof(List<T1>), typeof(List<T2>), typeof(List<T3>), typeof(List<T4>), typeof(List<T5>), typeof(List<T6>), typeof(List<T7>));
return (tuple[0] as List<T1>, tuple[1] as List<T2>, tuple[2] as List<T3>, tuple[3] as List<T4>, tuple[4] as List<T5>, tuple[5] as List<T6>, tuple[6] as List<T7>);
}
/// <summary>
/// 将 DataSet 转 元组
/// </summary>
/// <typeparam name="T1">元组元素类型</typeparam>
/// <typeparam name="T2">元组元素类型</typeparam>
/// <typeparam name="T3">元组元素类型</typeparam>
/// <typeparam name="T4">元组元素类型</typeparam>
/// <typeparam name="T5">元组元素类型</typeparam>
/// <typeparam name="T6">元组元素类型</typeparam>
/// <typeparam name="T7">元组元素类型</typeparam>
/// <typeparam name="T8">元组元素类型</typeparam>
/// <param name="dataSet">DataSet</param>
/// <returns>元组类型</returns>
public static (List<T1> list1, List<T2> list2, List<T3> list3, List<T4> list4, List<T5> list5, List<T6> list6, List<T7> list7, List<T8> list8) ToList<T1, T2, T3, T4, T5, T6, T7, T8>(this DataSet dataSet)
{
var tuple = dataSet.ToList(typeof(List<T1>), typeof(List<T2>), typeof(List<T3>), typeof(List<T4>), typeof(List<T5>), typeof(List<T6>), typeof(List<T7>), typeof(List<T8>));
return (tuple[0] as List<T1>, tuple[1] as List<T2>, tuple[2] as List<T3>, tuple[3] as List<T4>, tuple[4] as List<T5>, tuple[5] as List<T6>, tuple[6] as List<T7>, tuple[7] as List<T8>);
}
/// <summary>
/// 将 DataSet 转 特定类型
/// </summary>
/// <param name="dataSet">DataSet</param>
/// <param name="returnTypes">特定类型集合</param>
/// <returns>List{object}</returns>
public static List<object> ToList(this DataSet dataSet, params Type[] returnTypes)
{
if (returnTypes == null || returnTypes.Length == 0) return default;
// 处理元组类型
if (returnTypes.Length == 1 && returnTypes[0].IsValueType)
{
returnTypes = returnTypes[0].GenericTypeArguments;
}
// 获取所有的 DataTable
var dataTables = dataSet.Tables;
// 处理 8 个结果集
if (returnTypes.Length >= 8)
{
return new List<object>
{
dataTables[0].ToList(returnTypes[0]),
dataTables[1].ToList(returnTypes[1]),
dataTables[2].ToList(returnTypes[2]),
dataTables[3].ToList(returnTypes[3]),
dataTables[4].ToList(returnTypes[4]),
dataTables[5].ToList(returnTypes[5]),
dataTables[6].ToList(returnTypes[6]),
dataTables[7].ToList(returnTypes[7])
};
}
// 处理 7 个结果集
else if (returnTypes.Length == 7)
{
return new List<object>
{
dataTables[0].ToList(returnTypes[0]),
dataTables[1].ToList(returnTypes[1]),
dataTables[2].ToList(returnTypes[2]),
dataTables[3].ToList(returnTypes[3]),
dataTables[4].ToList(returnTypes[4]),
dataTables[5].ToList(returnTypes[5]),
dataTables[6].ToList(returnTypes[6])
};
}
// 处理 6 个结果集
else if (returnTypes.Length == 6)
{
return new List<object>
{
dataTables[0].ToList(returnTypes[0]),
dataTables[1].ToList(returnTypes[1]),
dataTables[2].ToList(returnTypes[2]),
dataTables[3].ToList(returnTypes[3]),
dataTables[4].ToList(returnTypes[4]),
dataTables[5].ToList(returnTypes[5])
};
}
// 处理 5 个结果集
else if (returnTypes.Length == 5)
{
return new List<object>
{
dataTables[0].ToList(returnTypes[0]),
dataTables[1].ToList(returnTypes[1]),
dataTables[2].ToList(returnTypes[2]),
dataTables[3].ToList(returnTypes[3]),
dataTables[4].ToList(returnTypes[4])
};
}
// 处理 4 个结果集
else if (returnTypes.Length == 4)
{
return new List<object>
{
dataTables[0].ToList(returnTypes[0]),
dataTables[1].ToList(returnTypes[1]),
dataTables[2].ToList(returnTypes[2]),
dataTables[3].ToList(returnTypes[3])
};
}
// 处理 3 个结果集
else if (returnTypes.Length == 3)
{
return new List<object>
{
dataTables[0].ToList(returnTypes[0]),
dataTables[1].ToList(returnTypes[1]),
dataTables[2].ToList(returnTypes[2])
};
}
// 处理 2 个结果集
else if (returnTypes.Length == 2)
{
return new List<object>
{
dataTables[0].ToList(returnTypes[0]),
dataTables[1].ToList(returnTypes[1])
};
}
// 处理 1 个结果集
else
{
return new List<object>
{
dataTables[0].ToList(returnTypes[0])
};
}
}
/// <summary>
/// 将 DataSet 转 特定类型
/// </summary>
/// <param name="dataSet">DataSet</param>
/// <param name="returnTypes">特定类型集合</param>
/// <returns>object</returns>
public static Task<List<object>> ToListAsync(this DataSet dataSet, params Type[] returnTypes)
{
return Task.FromResult(dataSet.ToList(returnTypes));
}
/// <summary>
/// 将 DataTable 转 特定类型
/// </summary>
/// <param name="dataTable">DataTable</param>
/// <param name="returnType">返回值类型</param>
/// <returns>object</returns>
public static object ToList(this DataTable dataTable, Type returnType)
{
var isGenericType = returnType.IsGenericType;
// 获取类型真实返回类型
var underlyingType = isGenericType ? returnType.GenericTypeArguments.First() : returnType;
var resultType = typeof(List<>).MakeGenericType(underlyingType);
var list = Activator.CreateInstance(resultType);
var addMethod = resultType.GetMethod("Add");
// 将 DataTable 转为行集合
var dataRows = dataTable.AsEnumerable();
// 如果是基元类型
if (underlyingType.IsRichPrimitive())
{
// 遍历所有行
foreach (var dataRow in dataRows)
{
// 只取第一列数据
var firstColumnValue = dataRow[0];
// 转换成目标类型数据
var destValue = firstColumnValue?.ChangeType(underlyingType);
// 添加到集合中
_ = addMethod.Invoke(list, new[] { destValue });
}
}
// 处理Object类型
else if (underlyingType == typeof(object))
{
// 获取所有列名
var columns = dataTable.Columns;
// 遍历所有行
foreach (var dataRow in dataRows)
{
var dic = new Dictionary<string, object>();
foreach (DataColumn column in columns)
{
dic.Add(column.ColumnName, dataRow[column]);
}
_ = addMethod.Invoke(list, new[] { dic });
}
}
else
{
// 获取所有的数据列和类公开实例属性
var dataColumns = dataTable.Columns;
var properties = underlyingType.GetProperties(BindingFlags.Public | BindingFlags.Instance);
//.Where(p => !p.IsDefined(typeof(NotMappedAttribute), true)); // sql 数据转换无需判断 [NotMapperd] 特性
// 遍历所有行
foreach (var dataRow in dataRows)
{
var model = Activator.CreateInstance(underlyingType);
// 遍历所有属性并一一赋值
foreach (var property in properties)
{
// 获取属性对应的真实列名
var columnName = property.Name;
if (property.IsDefined(typeof(ColumnAttribute), true))
{
var columnAttribute = property.GetCustomAttribute<ColumnAttribute>(true);
if (!string.IsNullOrWhiteSpace(columnAttribute.Name)) columnName = columnAttribute.Name;
}
// 如果 DataTable 不包含该列名,则跳过
if (!dataColumns.Contains(columnName)) continue;
// 获取列值
var columnValue = dataRow[columnName];
// 如果列值未空,则跳过
if (columnValue == DBNull.Value) continue;
// 转换成目标类型数据
var destValue = columnValue?.ChangeType(property.PropertyType);
property.SetValue(model, destValue);
}
// 添加到集合中
_ = addMethod.Invoke(list, new[] { model });
}
}
return list;
}
/// <summary>
/// 将 DataTable 转 特定类型
/// </summary>
/// <param name="dataTable">DataTable</param>
/// <param name="returnType">返回值类型</param>
/// <returns>object</returns>
public static Task<object> ToListAsync(this DataTable dataTable, Type returnType)
{
return Task.FromResult(dataTable.ToList(returnType));
}
/// <summary>
/// 处理元组类型返回值
/// </summary>
/// <param name="dataSet">数据集</param>
/// <param name="tupleType">返回值类型</param>
/// <returns></returns>
internal static object ToValueTuple(this DataSet dataSet, Type tupleType)
{
// 获取元组最底层类型
var underlyingTypes = tupleType.GetGenericArguments().Select(u => u.IsGenericType ? u.GetGenericArguments().First() : u);
var toListMethod = typeof(DbDataConvertExtensions)
.GetMethods(BindingFlags.Public | BindingFlags.Static)
.First(u => u.Name == "ToList" && u.IsGenericMethod && u.GetGenericArguments().Length == tupleType.GetGenericArguments().Length)
.MakeGenericMethod(underlyingTypes.ToArray());
return toListMethod.Invoke(null, new[] { dataSet });
}
}
}

View File

@@ -1,14 +1,18 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.IO;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Serialization.Formatters.Binary;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
using System.Xml;
using System.Xml.Linq;
@@ -138,39 +142,41 @@ namespace Infrastructure.Extensions
return objectList;
}
public static object ChangeType(this object convertibleValue, Type type)
{
if (null == convertibleValue) return null;
try
{
if (type == typeof(Guid) || type == typeof(Guid?))
{
string value = convertibleValue.ToString();
if (value == "") return null;
return Guid.Parse(value);
}
if (!type.IsGenericType) return Convert.ChangeType(convertibleValue, type);
if (type.ToString() == "System.Nullable`1[System.Boolean]" || type.ToString() == "System.Boolean")
{
if (convertibleValue.ToString() == "0")
return false;
return true;
}
Type genericTypeDefinition = type.GetGenericTypeDefinition();
if (genericTypeDefinition == typeof(Nullable<>))
{
return Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(type));
}
}
catch
{
return null;
}
return null;
}
//
// public static object ChangeType(this object convertibleValue, Type type)
// {
// if (null == convertibleValue) return null;
//
// try
// {
// if (type == typeof(Guid) || type == typeof(Guid?))
// {
// string value = convertibleValue.ToString();
// if (value == "") return null;
// return Guid.Parse(value);
// }
//
// if (!type.IsGenericType) return Convert.ChangeType(convertibleValue, type);
// if (type.ToString() == "System.Nullable`1[System.Boolean]" || type.ToString() == "System.Boolean")
// {
// if (convertibleValue.ToString() == "0")
// return false;
// return true;
// }
// Type genericTypeDefinition = type.GetGenericTypeDefinition();
// if (genericTypeDefinition == typeof(Nullable<>))
// {
// return Convert.ChangeType(convertibleValue, Nullable.GetUnderlyingType(type));
// }
// }
// catch
// {
// return null;
// }
// return null;
// }
/// <summary>
/// 将集合转换为数据集。
/// </summary>
@@ -1193,6 +1199,269 @@ namespace Infrastructure.Extensions
{
return EmailRegex.IsMatch(email);
}
/// <summary>
/// 将 DateTimeOffset 转换成 DateTime
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTime ConvertToDateTime(this DateTimeOffset dateTime)
{
if (dateTime.Offset.Equals(TimeSpan.Zero))
return dateTime.UtcDateTime;
else if (dateTime.Offset.Equals(TimeZoneInfo.Local.GetUtcOffset(dateTime.DateTime)))
return DateTime.SpecifyKind(dateTime.DateTime, DateTimeKind.Local);
else
return dateTime.DateTime;
}
/// <summary>
/// 将 DateTime 转换成 DateTimeOffset
/// </summary>
/// <param name="dateTime"></param>
/// <returns></returns>
public static DateTimeOffset ConvertToDateTimeOffset(this DateTime dateTime)
{
return DateTime.SpecifyKind(dateTime, DateTimeKind.Local);
}
/// <summary>
/// 判断是否是富基元类型
/// </summary>
/// <param name="type">类型</param>
/// <returns></returns>
internal static bool IsRichPrimitive(this Type type)
{
// 处理元组类型
if (type.IsValueTuple()) return false;
// 处理数组类型,基元数组类型也可以是基元类型
if (type.IsArray) return type.GetElementType().IsRichPrimitive();
// 基元类型或值类型或字符串类型
if (type.IsPrimitive || type.IsValueType || type == typeof(string)) return true;
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) return type.GenericTypeArguments[0].IsRichPrimitive();
return false;
}
/// <summary>
/// 合并两个字典
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dic">字典</param>
/// <param name="newDic">新字典</param>
/// <returns></returns>
internal static Dictionary<string, T> AddOrUpdate<T>(this Dictionary<string, T> dic, Dictionary<string, T> newDic)
{
foreach (var key in newDic.Keys)
{
if (dic.ContainsKey(key))
dic[key] = newDic[key];
else
dic.Add(key, newDic[key]);
}
return dic;
}
/// <summary>
/// 判断是否是元组类型
/// </summary>
/// <param name="type">类型</param>
/// <returns></returns>
internal static bool IsValueTuple(this Type type)
{
return type.ToString().StartsWith(typeof(ValueTuple).FullName);
}
/// <summary>
/// 判断方法是否是异步
/// </summary>
/// <param name="method">方法</param>
/// <returns></returns>
internal static bool IsAsync(this MethodInfo method)
{
return method.ReturnType.IsAsync();
}
/// <summary>
/// 判断类型是否是异步类型
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
internal static bool IsAsync(this Type type)
{
return type.ToString().StartsWith(typeof(Task).FullName);
}
/// <summary>
/// 判断类型是否实现某个泛型
/// </summary>
/// <param name="type">类型</param>
/// <param name="generic">泛型类型</param>
/// <returns>bool</returns>
internal static bool HasImplementedRawGeneric(this Type type, Type generic)
{
// 检查接口类型
var isTheRawGenericType = type.GetInterfaces().Any(IsTheRawGenericType);
if (isTheRawGenericType) return true;
// 检查类型
while (type != null && type != typeof(object))
{
isTheRawGenericType = IsTheRawGenericType(type);
if (isTheRawGenericType) return true;
type = type.BaseType;
}
return false;
// 判断逻辑
bool IsTheRawGenericType(Type type) => generic == (type.IsGenericType ? type.GetGenericTypeDefinition() : type);
}
/// <summary>
/// 判断是否是匿名类型
/// </summary>
/// <param name="obj">对象</param>
/// <returns></returns>
internal static bool IsAnonymous(this object obj)
{
var type = obj.GetType();
return Attribute.IsDefined(type, typeof(CompilerGeneratedAttribute), false)
&& type.IsGenericType && type.Name.Contains("AnonymousType")
&& (type.Name.StartsWith("<>") || type.Name.StartsWith("VB$"))
&& type.Attributes.HasFlag(TypeAttributes.NotPublic);
}
/// <summary>
/// 获取所有祖先类型
/// </summary>
/// <param name="type"></param>
/// <returns></returns>
internal static IEnumerable<Type> GetAncestorTypes(this Type type)
{
var ancestorTypes = new List<Type>();
while (type != null && type != typeof(object))
{
if (IsNoObjectBaseType(type))
{
var baseType = type.BaseType;
ancestorTypes.Add(baseType);
type = baseType;
}
else break;
}
return ancestorTypes;
static bool IsNoObjectBaseType(Type type) => type.BaseType != typeof(object);
}
/// <summary>
/// 获取方法真实返回类型
/// </summary>
/// <param name="method"></param>
/// <returns></returns>
internal static Type GetRealReturnType(this MethodInfo method)
{
// 判断是否是异步方法
var isAsyncMethod = method.IsAsync();
// 获取类型返回值并处理 Task 和 Task<T> 类型返回值
var returnType = method.ReturnType;
return isAsyncMethod ? (returnType.GenericTypeArguments.FirstOrDefault() ?? typeof(void)) : returnType;
}
/// <summary>
/// 首字母大写
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
internal static string ToTitleCase(this string str)
{
return Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
}
/// <summary>
/// 将一个对象转换为指定类型
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <returns></returns>
internal static T ChangeType<T>(this object obj)
{
return (T)ChangeType(obj, typeof(T));
}
/// <summary>
/// 将一个对象转换为指定类型
/// </summary>
/// <param name="obj">待转换的对象</param>
/// <param name="type">目标类型</param>
/// <returns>转换后的对象</returns>
internal static object ChangeType(this object obj, Type type)
{
if (type == null) return obj;
if (obj == null) return type.IsValueType ? Activator.CreateInstance(type) : null;
var underlyingType = Nullable.GetUnderlyingType(type);
if (type.IsAssignableFrom(obj.GetType())) return obj;
else if ((underlyingType ?? type).IsEnum)
{
if (underlyingType != null && string.IsNullOrWhiteSpace(obj.ToString())) return null;
else return Enum.Parse(underlyingType ?? type, obj.ToString());
}
// 处理DateTime -> DateTimeOffset 类型
else if (obj.GetType().Equals(typeof(DateTime)) && (underlyingType ?? type).Equals(typeof(DateTimeOffset)))
{
return ((DateTime)obj).ConvertToDateTimeOffset();
}
// 处理 DateTimeOffset -> DateTime 类型
else if (obj.GetType().Equals(typeof(DateTimeOffset)) && (underlyingType ?? type).Equals(typeof(DateTime)))
{
return ((DateTimeOffset)obj).ConvertToDateTime();
}
else if (typeof(IConvertible).IsAssignableFrom(underlyingType ?? type))
{
try
{
return Convert.ChangeType(obj, underlyingType ?? type, null);
}
catch
{
return underlyingType == null ? Activator.CreateInstance(type) : null;
}
}
else
{
var converter = TypeDescriptor.GetConverter(type);
if (converter.CanConvertFrom(obj.GetType())) return converter.ConvertFrom(obj);
var constructor = type.GetConstructor(Type.EmptyTypes);
if (constructor != null)
{
var o = constructor.Invoke(null);
var propertys = type.GetProperties();
var oldType = obj.GetType();
foreach (var property in propertys)
{
var p = oldType.GetProperty(property.Name);
if (property.CanWrite && p != null && p.CanRead)
{
property.SetValue(o, ChangeType(p.GetValue(obj, null), property.PropertyType), null);
}
}
return o;
}
}
return obj;
}
}

View File

@@ -0,0 +1,22 @@
using System;
using Microsoft.Extensions.Configuration;
namespace Infrastructure.Helpers
{
public class ConfigHelper
{
public static IConfigurationRoot GetConfigRoot()
{
var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.SetBasePath(System.IO.Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile(
$"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Development"}.json",
optional: true)
.AddEnvironmentVariables();
var configuration = configurationBuilder.Build();
return configuration;
}
}
}

View File

@@ -12,6 +12,7 @@
<PackageReference Include="AutoMapper" Version="9.0.0" />
<PackageReference Include="EnyimMemcachedCore" Version="2.1.5" />
<PackageReference Include="log4net" Version="2.0.12" />
<PackageReference Include="Microsoft.AspNetCore.Http" Version="2.2.2" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="3.1.0" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />

View File

@@ -0,0 +1,20 @@
using Microsoft.AspNetCore.Builder;
namespace Infrastructure.Middleware
{
/// <summary>
///
/// </summary>
public static class ApplicationBuilderExtension
{
/// <summary>
/// 注入日志中间件
/// </summary>
/// <param name="builder"></param>
/// <returns></returns>
public static IApplicationBuilder UseLogMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestResponseLoggingMiddleware>();
}
}
}

View File

@@ -0,0 +1,150 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
namespace Infrastructure.Middleware
{
/// <summary>
/// 请求与返回中间件
/// </summary>
public class RequestResponseLoggingMiddleware
{
private readonly RequestDelegate _next;
private readonly ILogger<RequestResponseLoggingMiddleware> _log;
/// <summary>
///
/// </summary>
public RequestResponseLoggingMiddleware(RequestDelegate next, ILogger<RequestResponseLoggingMiddleware> log)
{
_next = next;
_log = log;
}
/// <summary>
///
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task Invoke(HttpContext context)
{
#region context.Path api
var path = context.Request.Path.ToString().ToLower();
if (path.Contains("/index") || path.Contains("/check") ||
path.Contains("/swagger") || path.Contains("/getsysdatas") || path.Contains("/load"))
{
await CatchNext(context);
return;
}
#endregion
// 启用耗时 日志记录
var stopwatch = new Stopwatch();
stopwatch.Start();
var logData = new Dictionary<string, object>();
var request = context.Request;
logData.Add("request.url", request.Path.ToString());
logData.Add("request.headers",
request.Headers.ToDictionary(x => x.Key, v => string.Join(";", v.Value.ToList())));
logData.Add("request.method", request.Method);
logData.Add("request.executeStartTime", DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
//追踪实别器
logData.Add("traceIdentifier", context.TraceIdentifier);
// 获取请求body内容
if (request.Method.ToLower().Equals("post"))
{
// 启用倒带功能,就可以让 Request.Body 可以再次读取
request.EnableBuffering();
// 文件上传 记录文件信息
if (path.Contains("/upload"))
{
var content = string.Join(",", request.Form.Files.Select(item => item.FileName));
logData.Add("request.body", $"收到上传文件:{content}");
}
else
{
var sr = new StreamReader(request.Body, Encoding.UTF8);
//string content = sr.ReadToEnd(); //.Net Core 3.0 默认不再支持
var content = sr.ReadToEndAsync().Result;
logData.Add("request.body", content);
request.Body.Position = 0;
}
}
else if (request.Method.ToLower().Equals("get"))
{
logData.Add("request.body", request.QueryString.Value);
}
// 获取Response.Body内容
var originalBodyStream = context.Response.Body;
using (var responseBody = new MemoryStream())
{
context.Response.Body = responseBody;
await CatchNext(context);
if (!logData.ContainsKey("response.body"))
{
logData.Add("response.body", await GetResponse(context.Response));
}
logData.Add("response.executeEndTime", DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss.fff"));
logData.Add("response.statusCode", context.Response.StatusCode);
await responseBody.CopyToAsync(originalBodyStream);
}
// 响应完成记录时间和存入日志
context.Response.OnCompleted(() =>
{
try
{
stopwatch.Stop();
logData.Add("elapsedTime", stopwatch.ElapsedMilliseconds + "ms");
var json = JsonHelper.Instance.Serialize(logData);
_log.LogInformation(json);
return Task.CompletedTask;
}
catch (Exception ex)
{
return Task.FromException(ex);
}
});
}
private async Task CatchNext(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
_log.LogError(ex, "系统错误日志,管道捕获");
context.Response.StatusCode = 200;
context.Response.ContentType = "application/json; charset=utf-8";
var result = new { code = 500, message = ex.Message ?? "系统错误,请稍后再试" };
await context.Response.WriteAsync(JsonHelper.Instance.Serialize(result));
}
}
/// <summary>
/// 获取响应内容
/// </summary>
/// <param name="response"></param>
/// <returns></returns>
private static async Task<string> GetResponse(HttpResponse response)
{
response.Body.Seek(0, SeekOrigin.Begin);
var text = await new StreamReader(response.Body).ReadToEndAsync();
response.Body.Seek(0, SeekOrigin.Begin);
return text;
}
}
}

View File

@@ -1,24 +0,0 @@

using Microsoft.Extensions.Logging;
namespace Infrastructure
{
/// <summary>
/// 从3.0开始Startup ConfigureServices中不能使用ILogger需要扩展
/// </summary>
public class StartupLogger
{
private readonly ILogger<StartupLogger> _logger;
public StartupLogger(ILogger<StartupLogger> logger)
{
_logger = logger;
}
public void LogInformation(string message)
{
_logger.LogInformation(message);
}
}
}

View File

@@ -2,7 +2,15 @@
{
public class PageReq
{
/// <summary>
/// 页码
/// </summary>
/// <example>1</example>
public int page { get; set; }
/// <summary>
/// 每页条数
/// </summary>
/// <example>10</example>
public int limit { get; set; }
public string key { get; set; }

View File

@@ -0,0 +1,55 @@
using System;
using System.Linq;
using Infrastructure;
using OpenAuth.Repository.Domain;
using Quartz;
namespace OpenAuth.App.Extensions
{
/// <summary>
/// 定时任务扩展
/// </summary>
public static class OpenJobExt
{
/// <summary>
/// 启动定时任务
/// </summary>
/// <param name="job"></param>
/// <param name="scheduler">一个Quartz Scheduler</param>
public static void Start(this OpenJob job, IScheduler scheduler)
{
var jobBuilderType = typeof(JobBuilder);
var method = jobBuilderType.GetMethods().FirstOrDefault(
x => x.Name.Equals("Create", StringComparison.OrdinalIgnoreCase) &&
x.IsGenericMethod && x.GetParameters().Length == 0)
?.MakeGenericMethod(Type.GetType(job.JobCall));
var jobBuilder = (JobBuilder) method.Invoke(null, null);
IJobDetail jobDetail = jobBuilder.WithIdentity(job.Id).Build();
jobDetail.JobDataMap[Define.JOBMAPKEY] = job.Id; //传递job信息
ITrigger trigger = TriggerBuilder.Create()
.WithCronSchedule(job.Cron)
.WithIdentity(job.Id)
.StartNow()
.Build();
scheduler.ScheduleJob(jobDetail, trigger);
}
/// <summary>
/// 停止一个定时任务
/// </summary>
/// <param name="job"></param>
/// <param name="scheduler"></param>
public static void Stop(this OpenJob job, IScheduler scheduler)
{
TriggerKey triggerKey = new TriggerKey(job.Id);
// 停止触发器
scheduler.PauseTrigger(triggerKey);
// 移除触发器
scheduler.UnscheduleJob(triggerKey);
// 删除任务
scheduler.DeleteJob(new JobKey(job.Id));
}
}
}

View File

@@ -8,8 +8,8 @@
public const string START = "start round mix";
public const string END = "end round";
public const string NODE = "node";
public const string FORK = "fork"; //会签开始节点
public const string JOIN = "join"; //会签结束节点
public const string FORK = "fork"; //会签开始节点
public const string JOIN = "join"; //会签结束节点
public string id { get; set; }
@@ -33,9 +33,12 @@
public class Setinfo
{
public const string SPECIAL_USER = "SPECIAL_USER"; //指定用户
public const string ALL_USER = "ALL_USER"; //所有用户
public const string SPECIAL_ROLE = "SPECIAL_ROLE"; //指定角色
public const string ALL_USER = "ALL_USER"; //所有用户
public const string SPECIAL_ROLE = "SPECIAL_ROLE"; //指定角色
public const string SPECIAL_USER = "SPECIAL_USER"; //指定用户
public const string RUNTIME_SPECIAL_ROLE = "RUNTIME_SPECIAL_ROLE"; //运行时指定角色
public const string RUNTIME_SPECIAL_USER = "RUNTIME_SPECIAL_USER"; //运行时指定用户
/// <summary>
/// 节点执行权限类型
@@ -45,10 +48,11 @@
public Nodedesignatedata NodeDesignateData { get; set; }
public string NodeCode { get; set; }
public string NodeName { get; set; }
/// <summary>
/// 流程执行时三方回调的URL地址
/// </summary>
public string ThirdPartyUrl { get; set; }
public string ThirdPartyUrl { get; set; }
/// <summary>
/// 驳回节点0"前一步"1"第一步"2"某一步" 3"不处理"
@@ -98,6 +102,7 @@
/// 3驳回
/// </summary>
public int Taged { get; set; }
public string UserId { get; set; }
public string UserName { get; set; }
public string Description { get; set; }
@@ -112,7 +117,7 @@
public enum TagState
{
Ok = 1,
No ,
No,
Reject
}
}

View File

@@ -449,7 +449,7 @@ namespace OpenAuth.App.Flow
/// <summary>
/// 下一个节点对象
/// </summary>
public FlowNode nextNode => Nodes[nextNodeId];
public FlowNode nextNode => nextNodeId != "-1"? Nodes[nextNodeId] : null;
/// <summary>
/// 上一个节点

View File

@@ -63,6 +63,7 @@ namespace OpenAuth.App
/// <returns></returns>
public bool CreateInstance(AddFlowInstanceReq addFlowInstanceReq)
{
CheckNodeDesignate(addFlowInstanceReq);
FlowScheme scheme = null;
if (!string.IsNullOrEmpty(addFlowInstanceReq.SchemeId))
{
@@ -106,7 +107,7 @@ namespace OpenAuth.App
flowInstance.PreviousId = wfruntime.currentNodeId;
flowInstance.CreateUserId = user.User.Id;
flowInstance.CreateUserName = user.User.Account;
flowInstance.MakerList = (wfruntime.GetNextNodeType() != 4 ? GetNextMakers(wfruntime) : "");
flowInstance.MakerList = (wfruntime.GetNextNodeType() != 4 ? GetNextMakers(wfruntime, addFlowInstanceReq) : "");
flowInstance.IsFinish = (wfruntime.GetNextNodeType() == 4
? FlowInstanceStatus.Finished
: FlowInstanceStatus.Running);
@@ -145,15 +146,55 @@ namespace OpenAuth.App
UnitWork.Save();
return true;
}
/// <summary>
/// 更新流程
/// <para>更新时可以修改表单内容,可以修改流程基本信息,但不能更换表单模版</para>
/// </summary>
/// <param name="req"></param>
public void Update(UpdateFlowInstanceReq req)
{
var flowinstance = Get(req.Id);
if (flowinstance.IsFinish != FlowInstanceStatus.Draft &&
flowinstance.IsFinish != FlowInstanceStatus.Rejected)
{
throw new Exception("只能修改【草稿】和【驳回】状态的流程");
}
flowinstance.Description = req.Description;
flowinstance.Code = req.Code;
flowinstance.FrmData = req.FrmData;
flowinstance.DbName = req.DbName;
flowinstance.CustomName = req.CustomName;
Repository.Update(flowinstance);
}
/// <summary>
/// 节点审核
/// </summary>
/// <param name="instanceId"></param>
/// <returns></returns>
public bool NodeVerification(string instanceId, Tag tag)
public bool NodeVerification(VerificationReq request)
{
var user = _auth.GetCurrentUser().User;
var instanceId = request.FlowInstanceId;
var tag = new Tag
{
UserName = user.Name,
UserId = user.Id,
Description = request.VerificationOpinion,
Taged = Int32.Parse(request.VerificationFinally)
};
FlowInstance flowInstance = Get(instanceId);
if (flowInstance.MakerList != "1" && !flowInstance.MakerList.Contains(user.Id))
{
throw new Exception("当前用户没有审批该节点权限");
}
FlowInstanceOperationHistory flowInstanceOperationHistory = new FlowInstanceOperationHistory
{
InstanceId = instanceId,
@@ -231,7 +272,7 @@ namespace OpenAuth.App
flowInstance.ActivityId = wfruntime.nextNodeId;
flowInstance.ActivityType = wfruntime.nextNodeType;
flowInstance.ActivityName = wfruntime.nextNode.name;
flowInstance.MakerList = wfruntime.nextNodeType == 4 ? "" : GetNextMakers(wfruntime);
flowInstance.MakerList = wfruntime.nextNodeType == 4 ? "" : GetNextMakers(wfruntime, request);
flowInstance.IsFinish = (wfruntime.nextNodeType == 4
? FlowInstanceStatus.Finished
: FlowInstanceStatus.Running);
@@ -290,8 +331,11 @@ namespace OpenAuth.App
public bool NodeReject(VerificationReq reqest)
{
var user = _auth.GetCurrentUser().User;
FlowInstance flowInstance = Get(reqest.FlowInstanceId);
if (flowInstance.MakerList != "1" && !flowInstance.MakerList.Contains(user.Id))
{
throw new Exception("当前用户没有驳回该节点权限");
}
FlowRuntime wfruntime = new FlowRuntime(flowInstance);
@@ -351,7 +395,7 @@ namespace OpenAuth.App
/// 一般用于本节点审核完成后,修改流程实例的当前执行人,可以做到通知等功能
/// </summary>
/// <returns></returns>
private string GetNextMakers(FlowRuntime wfruntime)
private string GetNextMakers(FlowRuntime wfruntime, NodeDesignateReq request=null)
{
string makerList = "";
if (wfruntime.nextNodeId == "-1")
@@ -363,6 +407,23 @@ namespace OpenAuth.App
{
makerList = GetForkNodeMakers(wfruntime, wfruntime.nextNodeId);
}
else if (wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_ROLE)
{ //如果是运行时指定角色
if (wfruntime.nextNode.setInfo.NodeDesignate != request.NodeDesignateType)
{
throw new Exception("前端提交的节点权限类型异常,请检查流程");
}
var users = _revelanceApp.Get(Define.USERROLE, false, request.NodeDesignates);
makerList = GenericHelpers.ArrayToString(users, makerList);
}
else if (wfruntime.nextNode.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_USER)
{ //如果是运行时指定用户
if (wfruntime.nextNode.setInfo.NodeDesignate != request.NodeDesignateType)
{
throw new Exception("前端提交的节点权限类型异常,请检查流程");
}
makerList = GenericHelpers.ArrayToString(request.NodeDesignates, makerList);
}
else
{
makerList = GetNodeMarkers(wfruntime.nextNode);
@@ -465,6 +526,11 @@ namespace OpenAuth.App
var users = _revelanceApp.Get(Define.USERROLE, false, node.setInfo.NodeDesignateData.roles);
makerList = GenericHelpers.ArrayToString(users, makerList);
}
else if (node.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_ROLE
|| node.setInfo.NodeDesignate == Setinfo.RUNTIME_SPECIAL_USER)
{
//如果是运行时选定的用户,则暂不处理。由上个节点审批时选定
}
}
else //如果没有设置节点信息,默认所有人都可以审核
{
@@ -482,28 +548,47 @@ namespace OpenAuth.App
/// </summary>
public void Verification(VerificationReq request)
{
var user = _auth.GetCurrentUser().User;
var tag = new Tag
{
UserName = user.Name,
UserId = user.Id,
Description = request.VerificationOpinion,
Taged = Int32.Parse(request.VerificationFinally)
};
bool isReject = TagState.Reject.Equals((TagState) tag.Taged);
CheckNodeDesignate(request);
bool isReject = TagState.Reject.Equals((TagState) Int32.Parse(request.VerificationFinally));
if (isReject) //驳回
{
NodeReject(request);
}
else
{
NodeVerification(request.FlowInstanceId, tag);
NodeVerification(request);
}
}
public void Update(FlowInstance flowScheme)
/// <summary>
/// 判定节点需要选择执行人或执行角色
/// </summary>
/// <param name="request"></param>
/// <exception cref="Exception"></exception>
private void CheckNodeDesignate(NodeDesignateReq request)
{
Repository.Update(flowScheme);
if ((request.NodeDesignateType == Setinfo.RUNTIME_SPECIAL_ROLE
|| request.NodeDesignateType == Setinfo.RUNTIME_SPECIAL_USER) && request.NodeDesignates.Length == 0)
{
throw new Exception("下个节点需要选择执行人或执行角色");
}
}
/// <summary>
/// 返回用于处理流程节点
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public FlowVerificationResp GetForVerification(string id)
{
var flowinstance = Get(id);
var resp =flowinstance.MapTo<FlowVerificationResp>();
var runtime = new FlowRuntime(flowinstance);
if (runtime.nextNode != null && runtime.nextNode.setInfo !=null && runtime.nextNodeType != 4)
{
resp.NextNodeDesignateType = runtime.nextNode.setInfo.NodeDesignate;
}
return resp;
}
public async Task<TableData> Load(QueryFlowInstanceListReq request)
@@ -600,6 +685,11 @@ namespace OpenAuth.App
{
var user = _auth.GetCurrentUser().User;
FlowInstance flowInstance = Get(request.FlowInstanceId);
if (flowInstance.IsFinish == FlowInstanceStatus.Draft
|| flowInstance.IsFinish == FlowInstanceStatus.Finished)
{
throw new Exception("当前流程状态不能召回");
}
FlowRuntime wfruntime = new FlowRuntime(flowInstance);
@@ -635,6 +725,10 @@ namespace OpenAuth.App
public void Start(StartFlowInstanceReq request)
{
FlowInstance flowInstance = Get(request.FlowInstanceId);
if (flowInstance.IsFinish != FlowInstanceStatus.Draft)
{
throw new Exception("当前流程不是草稿状态,不能启动");
}
var wfruntime = new FlowRuntime(flowInstance);
var user = _auth.GetCurrentUser();

View File

@@ -15,7 +15,7 @@ namespace OpenAuth.App.Request
/// <summary>
/// 创建工作流请求
/// </summary>
public class AddFlowInstanceReq
public class AddFlowInstanceReq : NodeDesignateReq
{
/// <summary>

View File

@@ -0,0 +1,20 @@
using System.Collections.Generic;
namespace OpenAuth.App.Request
{
public class NodeDesignateReq
{
/// <summary>
/// 如果下个执行节点是运行时指定执行者。需要传指定的类型
/// <para>取值为RUNTIME_SPECIAL_ROLE、RUNTIME_SPECIAL_USER</para>
/// </summary>
public string NodeDesignateType { get; set; }
/// <summary>
/// 如果下个执行节点是运行时指定执行者。该值表示具体的执行者
/// <para>如果NodeDesignateType为RUNTIME_SPECIAL_ROLE则该值为指定的角色</para>
/// <para>如果NodeDesignateType为RUNTIME_SPECIAL_USER则该值为指定的用户</para>
/// </summary>
public string[] NodeDesignates { get; set; }
}
}

View File

@@ -0,0 +1,63 @@
//------------------------------------------------------------------------------
// <autogenerated>
// This code was generated by a CodeSmith Template.
//
// DO NOT MODIFY contents of this file. Changes to this
// file will be lost if the code is regenerated.
// Author:Yubao Li
// </autogenerated>
//------------------------------------------------------------------------------
using System.ComponentModel;
namespace OpenAuth.App.Request
{
/// <summary>
/// 创建工作流请求
/// </summary>
public class UpdateFlowInstanceReq : NodeDesignateReq
{
/// <summary>
/// 待更改的流程实例ID
/// </summary>
public string Id { get; set; }
/// <summary>
/// 实例编号
/// </summary>
[Description("实例编号")]
public string Code { get; set; }
/// <summary>
/// 自定义名称
/// </summary>
[Description("自定义名称")]
public string CustomName { get; set; }
/// <summary>
/// 数据库名称
/// </summary>
[Description("数据库名称")]
public string DbName { get; set; }
/// <summary>
/// 表单数据
/// </summary>
[Description("表单数据")]
public string FrmData { get; set; }
/// <summary>
/// 所属部门
/// </summary>
[Description("所属部门")]
public string OrgId { get; set; }
/// <summary>
/// 实例备注
/// </summary>
[Description("实例备注")]
public string Description { get; set; }
}
}

View File

@@ -1,6 +1,8 @@
namespace OpenAuth.App.Request
using System.Collections.Generic;
namespace OpenAuth.App.Request
{
public class VerificationReq
public class VerificationReq : NodeDesignateReq
{
public string FlowInstanceId { get; set; }
/// <summary>
@@ -22,5 +24,6 @@
/// 驳回类型。null:使用节点配置的驳回类型/0:前一步/1:第一步/2指定节点使用NodeRejectStep
/// </summary>
public string NodeRejectType { get; set; }
}
}

View File

@@ -12,5 +12,10 @@ namespace OpenAuth.App.Response
{
get { return FormUtil.Preview(this); }
}
/// <summary>
/// 下个节点的执行权限方式
/// </summary>
public string NextNodeDesignateType { get; set; }
}
}

View File

@@ -11,17 +11,19 @@ namespace OpenAuth.App.HostedService
{
private readonly ILogger<QuartzService> _logger;
private IScheduler _scheduler;
private OpenJobApp _openJobApp;
public QuartzService(ILogger<QuartzService> logger, IScheduler scheduler)
public QuartzService(ILogger<QuartzService> logger, IScheduler scheduler, OpenJobApp openJobApp)
{
_logger = logger;
_scheduler = scheduler;
_openJobApp = openJobApp;
}
public Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("启动定时job可以在这里配置读取数据库需要启动的任务然后启动他们");
_scheduler.Start();
_openJobApp.StartAll();
return Task.CompletedTask;
}

View File

@@ -3,7 +3,9 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Infrastructure;
using Infrastructure.Const;
using Microsoft.Extensions.Logging;
using OpenAuth.App.Extensions;
using OpenAuth.App.Interface;
using OpenAuth.App.Jobs;
using OpenAuth.App.Request;
@@ -16,6 +18,9 @@ using Quartz;
namespace OpenAuth.App
{
/// <summary>
/// 系统定时任务管理
/// </summary>
public class OpenJobApp : BaseStringApp<OpenJob, OpenAuthDBContext>
{
private SysLogApp _sysLogApp;
@@ -41,10 +46,25 @@ namespace OpenAuth.App
return result;
}
/// <summary>
/// 启动所有状态为正在运行的任务
/// <para>通常应用在系统加载的时候</para>
/// </summary>
/// <returns></returns>
public async Task StartAll()
{
var jobs = Repository.Find(u => u.Status == (int) JobStatus.Running);
foreach (var job in jobs)
{
job.Start(_scheduler);
}
_logger.LogInformation("所有状态为正在运行的任务已启动");
}
public void Add(AddOrUpdateOpenJobReq req)
{
var obj = req.MapTo<OpenJob>();
//todo:补充或调整自己需要的字段
obj.CreateTime = DateTime.Now;
var user = _auth.GetCurrentUser().User;
obj.CreateUserId = user.Id;
@@ -67,12 +87,11 @@ namespace OpenAuth.App
UpdateTime = DateTime.Now,
UpdateUserId = user.Id,
UpdateUserName = user.Name
//todo:补充或调整自己需要的字段
});
}
#region
/// <summary>
/// 返回系统的job接口
/// </summary>
@@ -85,7 +104,7 @@ namespace OpenAuth.App
.ToArray();
return types.Select(u => u.FullName).ToList();
}
public void ChangeJobStatus(ChangeJobStatusReq req)
{
var job = Repository.FirstOrDefault(u => u.Id == req.Id);
@@ -93,40 +112,18 @@ namespace OpenAuth.App
{
throw new Exception("任务不存在");
}
if (req.Status == 0) //停止
{
TriggerKey triggerKey = new TriggerKey(job.Id);
// 停止触发器
_scheduler.PauseTrigger(triggerKey);
// 移除触发器
_scheduler.UnscheduleJob(triggerKey);
// 删除任务
_scheduler.DeleteJob(new JobKey(job.Id));
}
else //启动
{
var jobBuilderType = typeof(JobBuilder);
var method = jobBuilderType.GetMethods().FirstOrDefault(
x => x.Name.Equals("Create", StringComparison.OrdinalIgnoreCase) &&
x.IsGenericMethod && x.GetParameters().Length == 0)
?.MakeGenericMethod(Type.GetType(job.JobCall));
var jobBuilder = (JobBuilder)method.Invoke(null, null);
IJobDetail jobDetail = jobBuilder.WithIdentity(job.Id).Build();
jobDetail.JobDataMap[Define.JOBMAPKEY] = job.Id; //传递job信息
ITrigger trigger = TriggerBuilder.Create()
.WithCronSchedule(job.Cron)
.WithIdentity(job.Id)
.StartNow()
.Build();
_scheduler.ScheduleJob(jobDetail, trigger);
if (req.Status == (int) JobStatus.NotRun) //停止
{
job.Stop(_scheduler);
}
else //启动
{
job.Start(_scheduler);
}
var user = _auth.GetCurrentUser().User;
job.Status = req.Status;
@@ -135,14 +132,13 @@ namespace OpenAuth.App
job.UpdateUserName = user.Name;
Repository.Update(job);
}
/// <summary>
/// 记录任务运行结果
/// </summary>
/// <param name="jobId"></param>
public void RecordRun(string jobId)
{
var job = Repository.FirstOrDefault(u =>u.Id == jobId);
var job = Repository.FirstOrDefault(u => u.Id == jobId);
if (job == null)
{
_sysLogApp.Add(new SysLog
@@ -157,7 +153,7 @@ namespace OpenAuth.App
job.RunCount++;
job.LastRunTime = DateTime.Now;
Repository.Update(job);
_sysLogApp.Add(new SysLog
{
CreateName = "Quartz",
@@ -172,13 +168,13 @@ namespace OpenAuth.App
#endregion
public OpenJobApp(IUnitWork<OpenAuthDBContext> unitWork, IRepository<OpenJob,OpenAuthDBContext> repository,
IAuth auth, SysLogApp sysLogApp, IScheduler scheduler, ILogger<OpenJobApp> logger) : base(unitWork, repository, auth)
public OpenJobApp(IUnitWork<OpenAuthDBContext> unitWork, IRepository<OpenJob, OpenAuthDBContext> repository,
IAuth auth, SysLogApp sysLogApp, IScheduler scheduler, ILogger<OpenJobApp> logger) : base(unitWork,
repository, auth)
{
_sysLogApp = sysLogApp;
_scheduler = scheduler;
_logger = logger;
}
}
}

View File

@@ -12,6 +12,7 @@ namespace OpenAuth.App.SSO
/// <summary>
/// 应用的AppSecrect目前没判定可以随便填一个。如果需要判定请根据注释调整LoginParse.Do方法
/// </summary>
/// <example>openauth</example>
public string AppKey { get; set; }
public void Trim()

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.IO;
using System.Linq;
using Autofac.Extensions.DependencyInjection;
@@ -27,7 +27,7 @@ namespace OpenAuth.App.Test
serviceCollection.AddOptions();
//读取OpenAuth.WebApi的配置文件用于单元测试
var path = AppContext.BaseDirectory;
int pos = path.IndexOf("OpenAuth.App");
int pos = path.LastIndexOf("OpenAuth.");
var basepath = Path.Combine(path.Substring(0,pos) ,"OpenAuth.WebApi");
IConfiguration config = new ConfigurationBuilder()
.SetBasePath(basepath)

View File

@@ -63,6 +63,15 @@ namespace OpenAuth.App.Test
}
[Test]
public void GetDetail()
{
var app = _autofacServiceProvider.GetService<FlowInstanceApp>();
var flowinstance = app.GetForVerification("80e9db5f-419b-4b65-a274-abe2660608dd");
Console.WriteLine(JsonHelper.Instance.Serialize(flowinstance));
}
[Test]
public void Verificate()

View File

@@ -119,7 +119,7 @@ namespace OpenAuth.Mvc.Controllers
//添加或修改
[HttpPost]
public string Update(FlowInstance obj)
public string Update(UpdateFlowInstanceReq obj)
{
try
{

View File

@@ -1,5 +1,6 @@
using System;
using Autofac.Extensions.DependencyInjection;
using Infrastructure.Helpers;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
@@ -37,7 +38,10 @@ namespace OpenAuth.Mvc
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) //将默认ServiceProviderFactory指定为AutofacServiceProviderFactory
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://*:1802").UseStartup<Startup>();
var configuration = ConfigHelper.GetConfigRoot();
var httpHost = configuration["AppSetting:HttpHost"];
webBuilder.UseUrls(httpHost).UseStartup<Startup>();
Console.WriteLine($"启动成功,访问地址:{httpHost}");
});
}

View File

@@ -30,12 +30,12 @@ namespace OpenAuth.Mvc
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(provider =>
//在startup中需要强制创建log4net
var loggerFactory = LoggerFactory.Create(builder =>
{
var service = provider.GetRequiredService<ILogger<StartupLogger>>();
return new StartupLogger(service);
builder.AddLog4Net();
});
var logger = services.BuildServiceProvider().GetRequiredService<StartupLogger>();
ILogger logger = loggerFactory.CreateLogger<Startup>();
var identityServer = ((ConfigurationSection)Configuration.GetSection("AppSetting:IdentityServerUrl")).Value;
if (!string.IsNullOrEmpty(identityServer))
{

View File

@@ -16,6 +16,8 @@
"Version": "demo",
"DbTypes": {
"OpenAuthDBContext":"MySql" //数据库类型SqlServer、MySql、Oracle
}
},
"RedisConf": "redistest.cq-p.com.cn:8001,password=share_redis@123", //redis配置
"HttpHost": "http://*:1802" //启动绑定地址及端口
}
}

View File

@@ -17,6 +17,8 @@
"Version": "1.0", //如果为demo则可以防止post提交
"DbTypes": {
"OpenAuthDBContext":"SqlServer" //数据库类型SqlServer、MySql、Oracle
}
},
"RedisConf": "redistest.cq-p.com.cn:8001,password=share_redis@123", //redis配置
"HttpHost": "http://*:1802" //启动绑定地址及端口
}
}

View File

@@ -253,7 +253,7 @@ layui.config({
btn: ['火速围观'],
moveType: 1,
content: '<div style="padding:15px 20px; text-align:justify; line-height: 22px; text-indent:2em;border-bottom:1px solid #e2e2e2;">' +
'<p>郑重提示OpenAuth.Core 2.0新版上线,如以前访问过本站点请清空缓存后访问</p>' +
'<p>郑重提示OpenAuth.Core 3.1新版上线,如以前访问过本站点请清空缓存后访问</p>' +
'<p>喜欢的快快star吧</p></div>',
success: function(layero){
var btn = layero.find('.layui-layer-btn');

View File

@@ -162,9 +162,9 @@ namespace OpenAuth.Repository.Domain
[Description("实例备注")]
public string Description { get; set; }
/// <summary>
/// 是否完成
/// 是否完成,当前节点的状态也通过该值表示
/// </summary>
[Description("是否完成")]
[Description("是否完成,当前节点的状态也通过该值表示")]
public int IsFinish { get; set; }
/// <summary>
/// 执行人

View File

@@ -10,6 +10,8 @@
// ***********************************************************************
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
@@ -107,6 +109,13 @@ namespace OpenAuth.Repository.Interface
/// <returns></returns>
IQueryable<T> Query<T>(string sql, params object[] parameters) where T : class;
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <param name="sqlParams">存储过程参数</param>
List<T> ExecProcedure<T>(string procName,params DbParameter[] sqlParams) where T : class;
#region
Task<int> ExecuteSqlRawAsync(string sql);

View File

@@ -21,16 +21,14 @@ namespace OpenAuth.Repository
private ILoggerFactory _LoggerFactory;
private IHttpContextAccessor _httpContextAccessor;
private IConfiguration _configuration;
private IOptions<AppSetting> _appConfiguration;
public OpenAuthDBContext(DbContextOptions<OpenAuthDBContext> options, ILoggerFactory loggerFactory,
IHttpContextAccessor httpContextAccessor, IConfiguration configuration, IOptions<AppSetting> appConfiguration)
IHttpContextAccessor httpContextAccessor, IConfiguration configuration)
: base(options)
{
_LoggerFactory = loggerFactory;
_httpContextAccessor = httpContextAccessor;
_configuration = configuration;
_appConfiguration = appConfiguration;
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)

View File

@@ -1,4 +1,4 @@
using System;
using System;
using System.IO;
using System.Linq;
using System.Reflection;
@@ -39,7 +39,7 @@ namespace OpenAuth.Repository.Test
//模拟配置文件
//读取OpenAuth.WebApi的配置文件用于单元测试
var path = AppContext.BaseDirectory;
int pos = path.IndexOf("OpenAuth.Repository");
int pos = path.LastIndexOf("OpenAuth.");
var basepath = Path.Combine(path.Substring(0,pos) ,"OpenAuth.WebApi");
IConfiguration config = new ConfigurationBuilder()
.SetBasePath(basepath)

View File

@@ -0,0 +1,28 @@
using System;
using System.Linq;
using Infrastructure;
using NUnit.Framework;
using Microsoft.Extensions.DependencyInjection;
using OpenAuth.Repository.Domain;
using OpenAuth.Repository.Interface;
namespace OpenAuth.Repository.Test
{
/// <summary>
/// 测试UnitWork
/// </summary>
class TestUnitWork : TestBase
{
/// <summary>
/// 测试存储过程
/// </summary>
[Test]
public void ExecProcedure()
{
var unitWork = _autofacServiceProvider.GetService<IUnitWork<OpenAuthDBContext>>();
var users = unitWork.ExecProcedure<User>("sp_alluser");
Console.WriteLine(JsonHelper.Instance.Serialize(users));
}
}
}

View File

@@ -1,9 +1,13 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Data.Common;
using System.Linq;
using System.Linq.Expressions;
using System.Threading.Tasks;
using Infrastructure;
using Infrastructure.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage;
using OpenAuth.Repository.Core;
@@ -212,8 +216,29 @@ namespace OpenAuth.Repository
{
return _context.Query<T>().FromSqlRaw(sql, parameters);
}
#region
/// <summary>
/// 执行存储过程
/// </summary>
/// <param name="procName">存储过程名称</param>
/// <param name="sqlParams">存储过程参数</param>
public List<T> ExecProcedure<T>(string procName, params DbParameter[] sqlParams) where T : class
{
var connection = _context.Database.GetDbConnection();
using (var cmd = connection.CreateCommand())
{
_context.Database.OpenConnection();
cmd.CommandText = procName;
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.AddRange(sqlParams);
DbDataReader dr = cmd.ExecuteReader();
var datatable = new DataTable();
datatable.Load(dr);
return datatable.ToList<T>();
}
}
#region
/// <summary>
/// 异步执行sql

View File

@@ -13,6 +13,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "AccessObjs")]
public class AccessObjsController : ControllerBase
{
private readonly RevelanceManagerApp _app;

View File

@@ -11,6 +11,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "Applications")]
public class ApplicationsController : ControllerBase
{
private readonly AppManager _app;

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "BuilderTableColumns")]
public class BuilderTableColumnsController : ControllerBase
{
private readonly BuilderTableColumnApp _app;

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "BuilderTables")]
public class BuilderTablesController : ControllerBase
{
private readonly BuilderTableApp _app;

View File

@@ -13,6 +13,7 @@ using OpenAuth.App.Response;
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "CategoryTypes")]
public class CategoryTypesController : ControllerBase
{
private readonly CategoryTypeApp _app;

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "Categorys")]
public class CategorysController : ControllerBase
{
private readonly CategoryApp _app;

View File

@@ -23,6 +23,7 @@ using System.Collections.Generic;
using System.Linq;
using Infrastructure.Helpers;
using Microsoft.Extensions.Logging;
using StackExchange.Profiling;
namespace OpenAuth.WebApi.Controllers
{
@@ -32,6 +33,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "Check")]
public class CheckController : ControllerBase
{
private readonly IAuth _authUtil;
@@ -335,7 +337,7 @@ namespace OpenAuth.WebApi.Controllers
/// <returns></returns>
[HttpPost]
[AllowAnonymous]
public LoginResult Login([FromBody]PassportLoginRequest request)
public LoginResult Login(PassportLoginRequest request)
{
var result = new LoginResult();
try

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "DataPrivilegeRules")]
public class DataPrivilegeRulesController : ControllerBase
{
private readonly DataPrivilegeRuleApp _app;

View File

@@ -18,6 +18,7 @@ namespace OpenAuth.WebApi.Controllers
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "Files")]
public class FilesController :ControllerBase
{

View File

@@ -22,6 +22,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "FlowInstances")]
public class FlowInstancesController : ControllerBase
{
private readonly FlowInstanceApp _app;
@@ -32,8 +33,7 @@ namespace OpenAuth.WebApi.Controllers
var result = new Response<FlowVerificationResp>();
try
{
var flowinstance = _app.Get(id);
result.Result = flowinstance.MapTo<FlowVerificationResp>();
result.Result = _app.GetForVerification(id);
}
catch (Exception ex)
{
@@ -121,10 +121,14 @@ namespace OpenAuth.WebApi.Controllers
return result;
}
//添加或修改
/// <summary>
/// 更新流程
/// </summary>
/// <para>更新时可以修改表单内容,可以修改流程基本信息,但不能更换表单模版</para>
/// <returns></returns>
[HttpPost]
public Response Update(FlowInstance obj)
public Response Update(UpdateFlowInstanceReq obj)
{
var result = new Response();
try

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "FlowSchemes")]
public class FlowSchemesController : ControllerBase
{
private readonly FlowSchemeApp _app;

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "Forms")]
public class FormsController : ControllerBase
{
private readonly FormApp _app;

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "Modules")]
public class ModulesController : ControllerBase
{
private ModuleManagerApp _app;

View File

@@ -16,6 +16,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "OpenJobs")]
public class OpenJobsController : ControllerBase
{
private readonly OpenJobApp _app;

View File

@@ -11,6 +11,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "Orgs")]
public class OrgsController : ControllerBase
{
private readonly OrgManagerApp _app;

View File

@@ -17,6 +17,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "Resources")]
public class ResourcesController : ControllerBase
{
private readonly ResourceApp _app;

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "Roles")]
public class RolesController : ControllerBase
{
private readonly RoleApp _app;

View File

@@ -11,6 +11,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "SysConf")]
public class SysConfController :ControllerBase
{
private IOptions<AppSetting> _appConfiguration;

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "SysLogs")]
public class SysLogsController : ControllerBase
{
private readonly SysLogApp _app;

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "SysMessages")]
public class SysMessagesController : ControllerBase
{
private readonly SysMessageApp _app;

View File

@@ -12,7 +12,8 @@ namespace OpenAuth.WebApi.Controllers
/// 用户操作
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiController]
[ApiExplorerSettings(GroupName = "Users")]
public class UsersController : ControllerBase
{
private readonly UserManagerApp _app;

View File

@@ -15,6 +15,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "WmsInboundOrderDtbls")]
public class WmsInboundOrderDtblsController : ControllerBase
{
private readonly WmsInboundOrderDtblApp _app;

View File

@@ -14,6 +14,7 @@ namespace OpenAuth.WebApi.Controllers
/// </summary>
[Route("api/[controller]/[action]")]
[ApiController]
[ApiExplorerSettings(GroupName = "WmsInboundOrderTbls")]
public class WmsInboundOrderTblsController : ControllerBase
{
private readonly WmsInboundOrderTblApp _app;

View File

@@ -0,0 +1,50 @@
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace OpenAuth.WebApi.Model
{
/// <summary>
/// 自定义模态验证异常返回信息
/// </summary>
public class CustomBadRequest : ValidationProblemDetails
{
public CustomBadRequest(ActionContext context)
{
Title = "WebAPI客户端传入的参数无效";
Detail = "vue客户端或其他方式调用WebAPI时传入的参数类型与接口需要的类型不匹配";
Status = 400;
ConstructErrorMessages(context);
}
private void ConstructErrorMessages(ActionContext context)
{
foreach (var keyModelStatePair in context.ModelState)
{
var key = keyModelStatePair.Key;
var errors = keyModelStatePair.Value.Errors;
if(errors.Count == 0) continue;
if (errors.Count == 1)
{
var errorMessage = GetErrorMessage(errors[0]);
Errors.Add(key, new[] { errorMessage });
}
else
{
var errorMessages = new string[errors.Count];
for (var i = 0; i < errors.Count; i++)
{
errorMessages[i] = GetErrorMessage(errors[i]);
}
Errors.Add(key, errorMessages);
}
}
}
string GetErrorMessage(ModelError error)
{
return string.IsNullOrEmpty(error.ErrorMessage) ?"The input was not valid.":error.ErrorMessage;
}
}
}

View File

@@ -0,0 +1,33 @@
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Controllers;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace OpenAuth.WebApi.Model
{
public class TagByApiExplorerSettingsOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (context.ApiDescription.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
{
var apiExplorerSettings = controllerActionDescriptor
.ControllerTypeInfo.GetCustomAttributes(typeof(ApiExplorerSettingsAttribute), true)
.Cast<ApiExplorerSettingsAttribute>().FirstOrDefault();
if (apiExplorerSettings != null && !string.IsNullOrWhiteSpace(apiExplorerSettings.GroupName))
{
operation.Tags = new List<OpenApiTag> {new OpenApiTag {Name = apiExplorerSettings.GroupName}};
}
else
{
operation.Tags = new List<OpenApiTag>
{new OpenApiTag {Name = controllerActionDescriptor.ControllerName}};
}
}
}
}
}

View File

@@ -21,6 +21,7 @@
<EmbeddedResource Remove="wwwroot\**" />
<None Remove="log\**" />
<None Remove="wwwroot\**" />
<EmbeddedResource Include="index.html" />
</ItemGroup>
<ItemGroup>
@@ -30,6 +31,10 @@
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.Logging.Log4Net.AspNetCore" Version="3.1.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.1.0" />
<PackageReference Include="MiniProfiler.AspNetCore" Version="4.2.22" />
<PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.2.22" />
<PackageReference Include="MiniProfiler.EntityFrameworkCore" Version="4.2.22" />
<PackageReference Include="MiniProfiler.Shared" Version="4.2.22" />
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
<PackageReference Include="NUnit" Version="3.13.1" />
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0" />

View File

@@ -1,6 +1,9 @@
using System;
using Autofac.Extensions.DependencyInjection;
using Infrastructure;
using Infrastructure.Helpers;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
@@ -39,7 +42,11 @@ namespace OpenAuth.WebApi
new AutofacServiceProviderFactory()) //将默认ServiceProviderFactory指定为AutofacServiceProviderFactory
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://*:52789").UseStartup<Startup>();
var configuration = ConfigHelper.GetConfigRoot();
var httpHost = configuration["AppSetting:HttpHost"];
webBuilder.UseUrls(httpHost).UseStartup<Startup>();
Console.WriteLine($"启动成功,接口访问地址:{httpHost}/swagger/index.html");
});
}
}

View File

@@ -2,10 +2,12 @@
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Autofac;
using IdentityServer4.AccessTokenValidation;
using Infrastructure;
using Infrastructure.Extensions.AutofacManager;
using Infrastructure.Middleware;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.DataProtection;
using Microsoft.AspNetCore.Mvc;
@@ -35,22 +37,19 @@ namespace OpenAuth.WebApi
Environment = environment;
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
services.AddSingleton(provider =>
//在startup中需要强制创建log4net
var loggerFactory = LoggerFactory.Create(builder =>
{
var service = provider.GetRequiredService<ILogger<StartupLogger>>();
return new StartupLogger(service);
builder.AddLog4Net();
});
var logger = services.BuildServiceProvider().GetRequiredService<StartupLogger>();
var identityServer = ((ConfigurationSection)Configuration.GetSection("AppSetting:IdentityServerUrl")).Value;
ILogger logger = loggerFactory.CreateLogger<Startup>();
var identityServer =
((ConfigurationSection) Configuration.GetSection("AppSetting:IdentityServerUrl")).Value;
if (!string.IsNullOrEmpty(identityServer))
{
services.AddAuthorization();
@@ -59,26 +58,42 @@ namespace OpenAuth.WebApi
.AddJwtBearer(options =>
{
options.Authority = identityServer;
options.RequireHttpsMetadata = false; // 指定是否为HTTPS
options.RequireHttpsMetadata = false; // 指定是否为HTTPS
options.Audience = "openauthapi";
});
});
}
// 添加MiniProfiler服务
services.AddMiniProfiler(options =>
{
// 设定访问分析结果URL的路由基地址
options.RouteBasePath = "/profiler";
options.ColorScheme = StackExchange.Profiling.ColorScheme.Auto;
options.PopupRenderPosition = StackExchange.Profiling.RenderPosition.BottomLeft;
options.PopupShowTimeWithChildren = true;
options.PopupShowTrivial = true;
options.SqlFormatter = new StackExchange.Profiling.SqlFormatters.InlineFormatter();
// options.IgnoredPaths.Add("/swagger/");
}).AddEntityFramework();//显示SQL语句及耗时
//添加swagger
services.AddSwaggerGen(option =>
{
option.SwaggerDoc("v1", new OpenApiInfo
foreach (var controller in GetControllers())
{
Version = "v1",
Title = " OpenAuth.WebApi",
Description = "by yubaolee"
});
option.SwaggerDoc(controller.Name.Replace("Controller", ""), new OpenApiInfo
{
Version = "v1",
Title = controller.Name.Replace("Controller", ""),
Description = "by yubaolee"
});
}
logger.LogInformation($"api doc basepath:{AppContext.BaseDirectory}");
foreach (var name in Directory.GetFiles(AppContext.BaseDirectory, "*.*",
SearchOption.AllDirectories).Where(f =>Path.GetExtension(f).ToLower() == ".xml"))
SearchOption.AllDirectories).Where(f => Path.GetExtension(f).ToLower() == ".xml"))
{
option.IncludeXmlComments(name,includeControllerXmlComments:true);
option.IncludeXmlComments(name, includeControllerXmlComments: true);
// logger.LogInformation($"find api file{name}");
}
@@ -98,28 +113,36 @@ namespace OpenAuth.WebApi
AuthorizationUrl = new Uri($"{identityServer}/connect/authorize"),
Scopes = new Dictionary<string, string>
{
{ "openauthapi", "同意openauth.webapi 的访问权限" }//指定客户端请求的api作用域。 如果为空,则客户端无法访问
{"openauthapi", "同意openauth.webapi 的访问权限"} //指定客户端请求的api作用域。 如果为空,则客户端无法访问
}
}
}
});
option.OperationFilter<AuthResponsesOperationFilter>();
}
});
services.Configure<AppSetting>(Configuration.GetSection("AppSetting"));
services.AddControllers(option =>
{
option.Filters.Add< OpenAuthFilter>();
}).AddNewtonsoftJson(options =>
{
//忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//不使用驼峰样式的key
//options.SerializerSettings.ContractResolver = new DefaultContractResolver();
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
});
services.AddControllers(option => { option.Filters.Add<OpenAuthFilter>(); })
.ConfigureApiBehaviorOptions(options =>
{
// 禁用自动模态验证
// options.SuppressModelStateInvalidFilter = true;
//启动WebAPI自动模态验证处理返回值
options.InvalidModelStateResponseFactory = context =>
{
var problems = new CustomBadRequest(context);
return new BadRequestObjectResult(problems);
};
}).AddNewtonsoftJson(options =>
{
//忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//不使用驼峰样式的key
//options.SerializerSettings.ContractResolver = new DefaultContractResolver();
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
});
services.AddMemoryCache();
services.AddCors();
// todo:如果正式 环境请用下面的方式限制随意访问跨域
@@ -140,7 +163,7 @@ namespace OpenAuth.WebApi
// policy.AllowAnyHeader().AllowAnyMethod().AllowCredentials().WithOrigins(origins)));
//在startup里面只能通过这种方式获取到appsettings里面的值不能用IOptions😰
var dbtypes = ((ConfigurationSection)Configuration.GetSection("AppSetting:DbTypes")).GetChildren()
var dbtypes = ((ConfigurationSection) Configuration.GetSection("AppSetting:DbTypes")).GetChildren()
.ToDictionary(x => x.Key, x => x.Value);
var connectionString = Configuration.GetConnectionString("OpenAuthDBContext");
logger.LogInformation($"系统配置的数据库类型:{JsonHelper.Instance.Serialize(dbtypes)},连接字符串:{connectionString}");
@@ -149,12 +172,23 @@ namespace OpenAuth.WebApi
services.AddHttpClient();
services.AddDataProtection().PersistKeysToFileSystem(new DirectoryInfo(Configuration["DataProtection"]));
//设置定时启动的任务
services.AddHostedService<QuartzService>();
}
private List<Type> GetControllers()
{
Assembly asm = Assembly.GetExecutingAssembly();
var controlleractionlist = asm.GetTypes()
.Where(type => typeof(ControllerBase).IsAssignableFrom(type))
.OrderBy(x => x.Name).ToList();
return controlleractionlist;
}
public void ConfigureContainer(ContainerBuilder builder)
{
AutofacExt.InitAutofac(builder);
@@ -164,12 +198,14 @@ namespace OpenAuth.WebApi
public void Configure(IApplicationBuilder app, IHostEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddLog4Net();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseMiniProfiler();
//可以访问根目录下面的静态文件
var staticfile = new StaticFileOptions
{
@@ -181,36 +217,42 @@ namespace OpenAuth.WebApi
}
};
app.UseStaticFiles(staticfile);
//todo:测试可以允许任意跨域,正式环境要加权限
app.UseCors(builder => builder.AllowAnyOrigin()
.AllowAnyMethod()
.AllowAnyHeader());
app.UseRouting();
app.UseAuthentication();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
// 启用日志追踪记录和异常友好提示
app.UseLogMiddleware();
app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
//配置ServiceProvider
AutofacContainerModule.ConfigServiceProvider(app.ApplicationServices);
app.UseSwagger();
app.UseSwagger();
// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.),
// specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "V1 Docs");
c.DocExpansion(DocExpansion.None);
c.OAuthClientId("OpenAuth.WebApi"); //oauth客户端名称
{
c.IndexStream = () => GetType().GetTypeInfo().Assembly.GetManifestResourceStream("OpenAuth.WebApi.index.html");
foreach (var controller in GetControllers())
{
c.SwaggerEndpoint($"/swagger/{controller.Name.Replace("Controller", "")}/swagger.json",
controller.Name.Replace("Controller", ""));
}
c.DocExpansion(DocExpansion.List); //默认展开列表
c.OAuthClientId("OpenAuth.WebApi"); //oauth客户端名称
c.OAuthAppName("开源版webapi认证"); // 描述
});
}
}
}
}

View File

@@ -18,6 +18,7 @@
"OpenAuthDBContext":"MySql" //数据库类型SqlServer、MySql、Oracle
},
"UploadPath": "", //附件上传的路径,如果为空则保存在站点根目录
"RedisConf": "your_redis_server:6379,password=your_redis_password" //redis配置信息
"RedisConf": "your_redis_server:6379,password=your_redis_password", //redis配置信息
"HttpHost": "http://*:52789" //启动绑定地址及端口
}
}

View File

@@ -7,7 +7,7 @@
"AllowedHosts": "*",
"DataProtection": "temp-keys/",
"ConnectionStrings": {
"OpenAuthDBContext": "Data Source=.;Initial Catalog=OpenAuthDB;User=sa;Password=000000"
"OpenAuthDBContext": "Data Source=.;Initial Catalog=OpenAuthPro;User=sa;Password=000000"
//"OpenAuthDBContext2": "DATA SOURCE=192.168.0.118:1521/YUBAO;PASSWORD=000000;Validate Connection=true;PERSIST SECURITY INFO=True;USER ID=yubaolee;" //Oracle
//"OpenAuthDBContext3": "server=127.0.0.1;user id=root;database=openauthpro;password=000000" //my sql
},
@@ -20,6 +20,7 @@
// ,"OpenAuthDBContext3":"MySql"
},
"UploadPath": "", //附件上传的路径,如果为空则保存在站点根目录
"RedisConf": "redistest.cq-p.com.cn:8001,password=share_redis@123"
"RedisConf": "redistest.cq-p.com.cn:8001,password=share_redis@123", //redis配置
"HttpHost": "http://*:52789" //启动绑定地址及端口
}
}

103
OpenAuth.WebApi/index.html Normal file
View File

@@ -0,0 +1,103 @@
<script async id="mini-profiler" src="/profiler/includes.min.js?v=4.2.22+4563a9e1ab"
data-version="4.2.22+4563a9e1ab" data-path="/profiler/"
data-current-id="7a3d98bb-3968-41fb-8836-65f9923ee6eb" data-ids="7a3d98bb-3968-41fb-8836-65f9923ee6eb"
data-position="Left" data-scheme="Light" data-authorized="true" data-max-traces="15"
data-toggle-shortcut="Alt+P" data-trivial-milliseconds="2.0"
data-ignored-duplicate-execute-types="Open,OpenAsync,Close,CloseAsync"></script>
<!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>OpenAuth.Net接口 - 最好用的.net权限工作流框架|.net core快速开发框架|.net core权限管理|.net core工作流</title>
<meta name="Keywords" content="openauth.net,.net开源工作流,.NET开源权限管理">
<meta name="Description" content="最好用的.net开源工作流框架,最好用的.NET开源权限管理框架">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<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>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position:absolute;width:0;height:0">
<defs>
<symbol viewBox="0 0 20 20" id="unlocked">
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V6h2v-.801C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8z"></path>
</symbol>
<symbol viewBox="0 0 20 20" id="locked">
<path d="M15.8 8H14V5.6C14 2.703 12.665 1 10 1 7.334 1 6 2.703 6 5.6V8H4c-.553 0-1 .646-1 1.199V17c0 .549.428 1.139.951 1.307l1.197.387C5.672 18.861 6.55 19 7.1 19h5.8c.549 0 1.428-.139 1.951-.307l1.196-.387c.524-.167.953-.757.953-1.306V9.199C17 8.646 16.352 8 15.8 8zM12 8H8V5.199C8 3.754 8.797 3 10 3c1.203 0 2 .754 2 2.199V8z" />
</symbol>
<symbol viewBox="0 0 20 20" id="close">
<path d="M14.348 14.849c-.469.469-1.229.469-1.697 0L10 11.819l-2.651 3.029c-.469.469-1.229.469-1.697 0-.469-.469-.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-.469-.469-.469-1.228 0-1.697.469-.469 1.228-.469 1.697 0L10 8.183l2.651-3.031c.469-.469 1.228-.469 1.697 0 .469.469.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c.469.469.469 1.229 0 1.698z" />
</symbol>
<symbol viewBox="0 0 20 20" id="large-arrow">
<path d="M13.25 10L6.109 2.58c-.268-.27-.268-.707 0-.979.268-.27.701-.27.969 0l7.83 7.908c.268.271.268.709 0 .979l-7.83 7.908c-.268.271-.701.27-.969 0-.268-.269-.268-.707 0-.979L13.25 10z" />
</symbol>
<symbol viewBox="0 0 20 20" id="large-arrow-down">
<path d="M17.418 6.109c.272-.268.709-.268.979 0s.271.701 0 .969l-7.908 7.83c-.27.268-.707.268-.979 0l-7.908-7.83c-.27-.268-.27-.701 0-.969.271-.268.709-.268.979 0L10 13.25l7.418-7.141z" />
</symbol>
<symbol viewBox="0 0 24 24" id="jump-to">
<path d="M19 7v4H5.83l3.58-3.59L8 6l-6 6 6 6 1.41-1.41L5.83 13H21V7z" />
</symbol>
<symbol viewBox="0 0 24 24" id="expand">
<path d="M10 18h4v-2h-4v2zM3 6v2h18V6H3zm3 7h12v-2H6v2z" />
</symbol>
</defs>
</svg>
<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>
window.onload = function () {
var configObject = JSON.parse('%(ConfigObject)');
var oauthConfigObject = JSON.parse('%(OAuthConfigObject)');
// Apply mandatory parameters
configObject.dom_id = "#swagger-ui";
configObject.presets = [SwaggerUIBundle.presets.apis, SwaggerUIStandalonePreset];
configObject.layout = "StandaloneLayout";
// 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");
// Build a system
const ui = SwaggerUIBundle(configObject);
// Apply OAuth config
ui.initOAuth(oauthConfigObject);
}
</script>
</body>
</html>

View File

@@ -1,83 +0,0 @@
2020-04-24 14:01:00,313 [5] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-04-24 14:01:00,371 [5] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-04-24 14:01:00,375 [5] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-04-24 14:01:00,386 [5] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-04-24 14:01:00,388 [5] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-04-24 14:10:49,081 [4] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-04-24 14:10:49,128 [4] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-04-24 14:10:49,130 [4] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-04-24 14:10:49,134 [4] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-04-24 14:10:49,135 [4] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-04-24 14:16:04,722 [5] INFO OpenAuth.WebApi.Controllers.CheckController [(null)] - Login enter
2020-04-24 14:19:15,233 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-04-24 14:19:15,440 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-04-24 14:19:15,442 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-04-24 14:19:15,444 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-04-24 14:19:15,445 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-04-24 14:19:24,275 [8] ERROR Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware [(null)] - An unhandled exception has occurred while executing the request.
System.NullReferenceException: Object reference not set to an instance of an object.
at OpenAuth.WebApi.Model.OpenAuthFilter.OnActionExecuting(ActionExecutingContext context) in C:\Project\OpenAuth.Core\OpenAuth.WebApi\Model\OpenAuthFilter.cs:line 48
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
2020-04-24 14:23:44,485 [16] ERROR Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware [(null)] - An unhandled exception has occurred while executing the request.
System.NullReferenceException: Object reference not set to an instance of an object.
at OpenAuth.WebApi.Model.OpenAuthFilter.OnActionExecuting(ActionExecutingContext context) in C:\Project\OpenAuth.Core\OpenAuth.WebApi\Model\OpenAuthFilter.cs:line 48
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Rethrow(ActionExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
2020-04-24 14:23:46,083 [13] INFO OpenAuth.WebApi.Controllers.CheckController [(null)] - Login enter
2020-04-24 17:14:41,900 [5] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-04-24 17:14:41,936 [5] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-04-24 17:14:41,937 [5] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-04-24 17:14:41,939 [5] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-04-24 17:14:41,939 [5] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-04-24 17:24:21,526 [23] ERROR Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware [(null)] - An unhandled exception has occurred while executing the request.
Autofac.Core.DependencyResolutionException: An exception was thrown while activating OpenAuth.App.OpenJobApp.
---> Autofac.Core.DependencyResolutionException: None of the constructors found with 'Autofac.Core.Activators.Reflection.DefaultConstructorFinder' on type 'OpenAuth.App.OpenJobApp' can be invoked with the available services and parameters:
Cannot resolve parameter 'Quartz.IScheduler scheduler' of constructor 'Void .ctor(OpenAuth.Repository.Interface.IUnitWork, OpenAuth.Repository.Interface.IRepository`1[OpenAuth.Repository.Domain.OpenJob], OpenAuth.App.Interface.IAuth, OpenAuth.App.SysLogApp, Quartz.IScheduler)'.
at Autofac.Core.Activators.Reflection.ReflectionActivator.GetValidConstructorBindings(ConstructorInfo[] availableConstructors, IComponentContext context, IEnumerable`1 parameters)
at Autofac.Core.Activators.Reflection.ReflectionActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.CreateInstance(IEnumerable`1 parameters)
--- End of inner exception stack trace ---
at Autofac.Core.Resolving.InstanceLookup.CreateInstance(IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request)
at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(ResolveRequest request)
at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request)
at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request)
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType)
at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
at lambda_method(Closure , IServiceProvider , Object[] )
at Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider.<>c__DisplayClass4_0.<CreateActivator>b__0(ControllerContext controllerContext)
at Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider.<>c__DisplayClass5_0.<CreateControllerFactory>g__CreateController|0(ControllerContext controllerContext)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

View File

@@ -1,114 +0,0 @@
2020-06-24 14:03:34,468 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Default Quartz.NET properties loaded from embedded resource file
2020-06-24 14:03:34,620 [1] INFO Quartz.Core.SchedulerSignalerImpl [(null)] - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
2020-06-24 14:03:34,633 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Quartz Scheduler v.3.0.7.0 created.
2020-06-24 14:03:34,634 [1] INFO Quartz.Core.QuartzScheduler [(null)] - JobFactory set to: Autofac.Extras.Quartz.AutofacJobFactory
2020-06-24 14:03:34,635 [1] INFO Quartz.Simpl.RAMJobStore [(null)] - RAMJobStore initialized.
2020-06-24 14:03:34,639 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2020-06-24 14:03:34,640 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler 'DefaultQuartzScheduler' initialized
2020-06-24 14:03:34,640 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler version: 3.0.7.0
2020-06-24 14:03:34,784 [1] INFO OpenAuth.App.HostedService.QuartzService [(null)] - 启动定时job可以在这里配置读取数据库需要启动的任务然后启动他们
2020-06-24 14:03:34,794 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2020-06-24 14:03:38,536 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-06-24 14:03:38,966 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-06-24 14:03:38,974 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-06-24 14:03:39,021 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-06-24 14:03:39,023 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-06-24 14:03:39,028 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\temp-keys\key-1d85dca2-27e9-431f-97d3-3f455c7b8852.xml
2020-06-24 14:09:15,588 [19] INFO OpenAuth.WebApi.Controllers.CheckController [(null)] - Login enter
2020-06-24 14:09:31,985 [21] ERROR Microsoft.EntityFrameworkCore.Database.Command [(null)] - Failed executing DbCommand (374ms) [Parameters=[@__p_1='?' (DbType = Int32), @__p_0='?' (DbType = Int32)], CommandType='Text', CommandTimeout='30']
SELECT `w`.`ExternalNo`, `w`.`ExternalType`, `w`.`Status`, `w`.`OrderType`, `w`.`GoodsType`, `w`.`PurchaseNo`, `w`.`StockId`, `w`.`OwnerId`, `w`.`ShipperId`, `w`.`SupplierId`, `w`.`ScheduledInboundTime`, `w`.`Remark`, `w`.`Enable`, `w`.`TransferType`, `w`.`InBondedArea`, `w`.`ReturnBoxNum`, `w`.`CreateTime`, `w`.`CreateUserId`, `w`.`CreateUserName`, `w`.`UpdateTime`, `w`.`UpdateUserId`, `w`.`UpdateUserName`, `w`.`OrgId`, `w`.`Id`
FROM `WmsInboundOrderTbl` AS `w`
ORDER BY `w`.`Id`
LIMIT @__p_1 OFFSET @__p_0
2020-06-24 14:09:32,138 [21] ERROR Microsoft.EntityFrameworkCore.Query [(null)] - An exception occurred while iterating over the results of a query for context type 'OpenAuth.Repository.OpenAuthDBContext'.
MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'w.OrgId' in 'field list'
---> MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'w.OrgId' in 'field list'
at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ResultSet.cs:line 49
at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 130
at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary`2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 391
at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList`1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\CommandExecutor.cs:line 62
at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 217
at System.Data.Common.DbCommand.ExecuteReader()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)
at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'w.OrgId' in 'field list'
---> MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'w.OrgId' in 'field list'
at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ResultSet.cs:line 49
at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 130
at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary`2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 391
at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList`1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\CommandExecutor.cs:line 62
at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 217
at System.Data.Common.DbCommand.ExecuteReader()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)
at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
2020-06-24 14:09:32,269 [21] ERROR Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware [(null)] - An unhandled exception has occurred while executing the request.
MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'w.OrgId' in 'field list'
---> MySql.Data.MySqlClient.MySqlException (0x80004005): Unknown column 'w.OrgId' in 'field list'
at MySqlConnector.Core.ResultSet.ReadResultSetHeaderAsync(IOBehavior ioBehavior) in C:\projects\mysqlconnector\src\MySqlConnector\Core\ResultSet.cs:line 49
at MySql.Data.MySqlClient.MySqlDataReader.ActivateResultSet() in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 130
at MySql.Data.MySqlClient.MySqlDataReader.CreateAsync(CommandListPosition commandListPosition, ICommandPayloadCreator payloadCreator, IDictionary`2 cachedProcedures, IMySqlCommand command, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlDataReader.cs:line 391
at MySqlConnector.Core.CommandExecutor.ExecuteReaderAsync(IReadOnlyList`1 commands, ICommandPayloadCreator payloadCreator, CommandBehavior behavior, IOBehavior ioBehavior, CancellationToken cancellationToken) in C:\projects\mysqlconnector\src\MySqlConnector\Core\CommandExecutor.cs:line 62
at MySql.Data.MySqlClient.MySqlCommand.ExecuteDbDataReader(CommandBehavior behavior) in C:\projects\mysqlconnector\src\MySqlConnector\MySql.Data.MySqlClient\MySqlCommand.cs:line 217
at System.Data.Common.DbCommand.ExecuteReader()
at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReader(RelationalCommandParameterObject parameterObject)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.InitializeReader(DbContext _, Boolean result)
at Pomelo.EntityFrameworkCore.MySql.Storage.Internal.MySqlExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable`1.Enumerator.MoveNext()
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeList(JsonWriter writer, IEnumerable values, JsonArrayContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeObject(JsonWriter writer, Object value, JsonObjectContract contract, JsonProperty member, JsonContainerContract collectionContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.SerializeValue(JsonWriter writer, Object value, JsonContract valueContract, JsonProperty member, JsonContainerContract containerContract, JsonProperty containerProperty)
at Newtonsoft.Json.Serialization.JsonSerializerInternalWriter.Serialize(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.SerializeInternal(JsonWriter jsonWriter, Object value, Type objectType)
at Newtonsoft.Json.JsonSerializer.Serialize(JsonWriter jsonWriter, Object value)
at Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
at Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
at Microsoft.AspNetCore.Mvc.Formatters.NewtonsoftJsonOutputFormatter.WriteResponseBodyAsync(OutputFormatterWriteContext context, Encoding selectedEncoding)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeNextResultFilterAsync>g__Awaited|29_0[TFilter,TFilterAsync](ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResultExecutedContextSealed context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.ResultNext[TFilter,TFilterAsync](State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeResultFilters()
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeFilterPipelineAsync>g__Awaited|19_0(ResourceInvoker invoker, Task lastTask, State next, Scope scope, Object state, Boolean isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.<InvokeAsync>g__Awaited|17_0(ResourceInvoker invoker, Task task, IDisposable scope)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
2020-06-24 14:11:13,907 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Default Quartz.NET properties loaded from embedded resource file
2020-06-24 14:11:14,108 [1] INFO Quartz.Core.SchedulerSignalerImpl [(null)] - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
2020-06-24 14:11:14,121 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Quartz Scheduler v.3.0.7.0 created.
2020-06-24 14:11:14,121 [1] INFO Quartz.Core.QuartzScheduler [(null)] - JobFactory set to: Autofac.Extras.Quartz.AutofacJobFactory
2020-06-24 14:11:14,122 [1] INFO Quartz.Simpl.RAMJobStore [(null)] - RAMJobStore initialized.
2020-06-24 14:11:14,126 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2020-06-24 14:11:14,127 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler 'DefaultQuartzScheduler' initialized
2020-06-24 14:11:14,127 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler version: 3.0.7.0
2020-06-24 14:11:14,261 [1] INFO OpenAuth.App.HostedService.QuartzService [(null)] - 启动定时job可以在这里配置读取数据库需要启动的任务然后启动他们
2020-06-24 14:11:14,267 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2020-06-24 14:11:15,882 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-06-24 14:11:15,912 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-06-24 14:11:15,914 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-06-24 14:11:15,916 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-06-24 14:11:15,918 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-06-24 14:11:15,923 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\temp-keys\key-1d85dca2-27e9-431f-97d3-3f455c7b8852.xml
2020-06-24 14:12:33,310 [8] INFO OpenAuth.WebApi.Controllers.CheckController [(null)] - Login enter
2020-06-24 14:16:58,276 [20] INFO OpenAuth.WebApi.Controllers.CheckController [(null)] - Login enter
2020-06-24 14:24:35,722 [56] INFO OpenAuth.WebApi.Controllers.CheckController [(null)] - Login enter
2020-06-24 14:33:59,644 [68] INFO OpenAuth.WebApi.Controllers.CheckController [(null)] - Login enter

View File

@@ -1,92 +0,0 @@
2020-08-07 14:39:04,933 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Default Quartz.NET properties loaded from embedded resource file
2020-08-07 14:39:05,486 [1] INFO Quartz.Core.SchedulerSignalerImpl [(null)] - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
2020-08-07 14:39:05,503 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Quartz Scheduler v.3.0.7.0 created.
2020-08-07 14:39:05,504 [1] INFO Quartz.Core.QuartzScheduler [(null)] - JobFactory set to: Autofac.Extras.Quartz.AutofacJobFactory
2020-08-07 14:39:05,505 [1] INFO Quartz.Simpl.RAMJobStore [(null)] - RAMJobStore initialized.
2020-08-07 14:39:05,512 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2020-08-07 14:39:05,516 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler 'DefaultQuartzScheduler' initialized
2020-08-07 14:39:05,516 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler version: 3.0.7.0
2020-08-07 14:39:05,749 [1] INFO OpenAuth.App.HostedService.QuartzService [(null)] - 启动定时job可以在这里配置读取数据库需要启动的任务然后启动他们
2020-08-07 14:39:05,756 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2020-08-07 14:39:09,971 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-08-07 14:39:10,389 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-08-07 14:39:10,415 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-08-07 14:39:10,923 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-08-07 14:39:11,110 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-08-07 14:39:11,153 [8] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\temp-keys\key-1d85dca2-27e9-431f-97d3-3f455c7b8852.xml
2020-08-07 14:44:03,021 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Default Quartz.NET properties loaded from embedded resource file
2020-08-07 14:44:03,383 [1] INFO Quartz.Core.SchedulerSignalerImpl [(null)] - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
2020-08-07 14:44:03,425 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Quartz Scheduler v.3.0.7.0 created.
2020-08-07 14:44:03,430 [1] INFO Quartz.Core.QuartzScheduler [(null)] - JobFactory set to: Autofac.Extras.Quartz.AutofacJobFactory
2020-08-07 14:44:03,440 [1] INFO Quartz.Simpl.RAMJobStore [(null)] - RAMJobStore initialized.
2020-08-07 14:44:03,445 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2020-08-07 14:44:03,447 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler 'DefaultQuartzScheduler' initialized
2020-08-07 14:44:03,448 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler version: 3.0.7.0
2020-08-07 14:44:03,649 [1] INFO OpenAuth.App.HostedService.QuartzService [(null)] - 启动定时job可以在这里配置读取数据库需要启动的任务然后启动他们
2020-08-07 14:44:03,654 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2020-08-07 14:44:04,890 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-08-07 14:44:04,981 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-08-07 14:44:04,985 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-08-07 14:44:05,001 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-08-07 14:44:05,003 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-08-07 14:44:05,028 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\temp-keys\key-1d85dca2-27e9-431f-97d3-3f455c7b8852.xml
2020-08-07 14:51:17,022 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Default Quartz.NET properties loaded from embedded resource file
2020-08-07 14:51:17,208 [1] INFO Quartz.Core.SchedulerSignalerImpl [(null)] - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
2020-08-07 14:51:17,223 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Quartz Scheduler v.3.0.7.0 created.
2020-08-07 14:51:17,223 [1] INFO Quartz.Core.QuartzScheduler [(null)] - JobFactory set to: Autofac.Extras.Quartz.AutofacJobFactory
2020-08-07 14:51:17,224 [1] INFO Quartz.Simpl.RAMJobStore [(null)] - RAMJobStore initialized.
2020-08-07 14:51:17,228 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2020-08-07 14:51:17,228 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler 'DefaultQuartzScheduler' initialized
2020-08-07 14:51:17,228 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler version: 3.0.7.0
2020-08-07 14:51:17,367 [1] INFO OpenAuth.App.HostedService.QuartzService [(null)] - 启动定时job可以在这里配置读取数据库需要启动的任务然后启动他们
2020-08-07 14:51:17,375 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2020-08-07 14:51:18,494 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-08-07 14:51:18,539 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-08-07 14:51:18,541 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-08-07 14:51:18,544 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-08-07 14:51:18,546 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-08-07 14:51:18,550 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\temp-keys\key-1d85dca2-27e9-431f-97d3-3f455c7b8852.xml
2020-08-07 14:53:08,792 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Default Quartz.NET properties loaded from embedded resource file
2020-08-07 14:53:08,982 [1] INFO Quartz.Core.SchedulerSignalerImpl [(null)] - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
2020-08-07 14:53:08,994 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Quartz Scheduler v.3.0.7.0 created.
2020-08-07 14:53:08,995 [1] INFO Quartz.Core.QuartzScheduler [(null)] - JobFactory set to: Autofac.Extras.Quartz.AutofacJobFactory
2020-08-07 14:53:08,996 [1] INFO Quartz.Simpl.RAMJobStore [(null)] - RAMJobStore initialized.
2020-08-07 14:53:08,998 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2020-08-07 14:53:08,999 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler 'DefaultQuartzScheduler' initialized
2020-08-07 14:53:08,999 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler version: 3.0.7.0
2020-08-07 14:53:09,131 [1] INFO OpenAuth.App.HostedService.QuartzService [(null)] - 启动定时job可以在这里配置读取数据库需要启动的任务然后启动他们
2020-08-07 14:53:09,136 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2020-08-07 14:53:10,015 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-08-07 14:53:10,053 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-08-07 14:53:10,056 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-08-07 14:53:10,058 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-08-07 14:53:10,062 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-08-07 14:53:10,067 [9] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\temp-keys\key-1d85dca2-27e9-431f-97d3-3f455c7b8852.xml

View File

@@ -1,23 +0,0 @@
2020-08-10 11:42:55,635 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Default Quartz.NET properties loaded from embedded resource file
2020-08-10 11:42:55,902 [1] INFO Quartz.Core.SchedulerSignalerImpl [(null)] - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
2020-08-10 11:42:55,971 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Quartz Scheduler v.3.0.7.0 created.
2020-08-10 11:42:55,973 [1] INFO Quartz.Core.QuartzScheduler [(null)] - JobFactory set to: Autofac.Extras.Quartz.AutofacJobFactory
2020-08-10 11:42:55,973 [1] INFO Quartz.Simpl.RAMJobStore [(null)] - RAMJobStore initialized.
2020-08-10 11:42:55,978 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2020-08-10 11:42:55,979 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler 'DefaultQuartzScheduler' initialized
2020-08-10 11:42:55,979 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler version: 3.0.7.0
2020-08-10 11:42:56,211 [1] INFO OpenAuth.App.HostedService.QuartzService [(null)] - 启动定时job可以在这里配置读取数据库需要启动的任务然后启动他们
2020-08-10 11:42:56,219 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2020-08-10 11:43:02,332 [10] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-08-10 11:43:02,480 [10] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-08-10 11:43:02,483 [10] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-08-10 11:43:02,486 [10] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-08-10 11:43:02,487 [10] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-08-10 11:43:02,496 [10] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\temp-keys\key-1d85dca2-27e9-431f-97d3-3f455c7b8852.xml

View File

@@ -1,17 +0,0 @@
2020-09-10 11:42:07,591 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Default Quartz.NET properties loaded from embedded resource file
2020-09-10 11:42:07,666 [1] INFO Quartz.Core.SchedulerSignalerImpl [(null)] - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
2020-09-10 11:42:07,680 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Quartz Scheduler v.3.0.7.0 created.
2020-09-10 11:42:07,681 [1] INFO Quartz.Core.QuartzScheduler [(null)] - JobFactory set to: Autofac.Extras.Quartz.AutofacJobFactory
2020-09-10 11:42:07,682 [1] INFO Quartz.Simpl.RAMJobStore [(null)] - RAMJobStore initialized.
2020-09-10 11:42:07,689 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2020-09-10 11:42:07,693 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler 'DefaultQuartzScheduler' initialized
2020-09-10 11:42:07,694 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler version: 3.0.7.0
2020-09-10 11:42:07,746 [1] INFO OpenAuth.App.HostedService.QuartzService [(null)] - 启动定时job可以在这里配置读取数据库需要启动的任务然后启动他们
2020-09-10 11:42:07,752 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.

View File

@@ -1,62 +0,0 @@
2020-09-28 14:00:58,834 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Default Quartz.NET properties loaded from embedded resource file
2020-09-28 14:00:59,132 [1] INFO Quartz.Core.SchedulerSignalerImpl [(null)] - Initialized Scheduler Signaller of type: Quartz.Core.SchedulerSignalerImpl
2020-09-28 14:00:59,202 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Quartz Scheduler v.3.0.7.0 created.
2020-09-28 14:00:59,203 [1] INFO Quartz.Core.QuartzScheduler [(null)] - JobFactory set to: Autofac.Extras.Quartz.AutofacJobFactory
2020-09-28 14:00:59,203 [1] INFO Quartz.Simpl.RAMJobStore [(null)] - RAMJobStore initialized.
2020-09-28 14:00:59,208 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler meta-data: Quartz Scheduler (v3.0.7.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'Quartz.Core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'Quartz.Simpl.DefaultThreadPool' - with 10 threads.
Using job-store 'Quartz.Simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2020-09-28 14:00:59,209 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler 'DefaultQuartzScheduler' initialized
2020-09-28 14:00:59,209 [1] INFO Quartz.Impl.StdSchedulerFactory [(null)] - Quartz scheduler version: 3.0.7.0
2020-09-28 14:00:59,516 [1] INFO OpenAuth.App.HostedService.QuartzService [(null)] - 启动定时job可以在这里配置读取数据库需要启动的任务然后启动他们
2020-09-28 14:00:59,525 [1] INFO Quartz.Core.QuartzScheduler [(null)] - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
2020-09-28 14:01:05,655 [11] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - api doc basepath:C:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\
2020-09-28 14:01:06,227 [11] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\Infrastructure.xml
2020-09-28 14:01:06,241 [11] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.App.xml
2020-09-28 14:01:06,247 [11] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.Repository.xml
2020-09-28 14:01:06,249 [11] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\OpenAuth.WebApi.xml
2020-09-28 14:01:06,256 [11] INFO OpenAuth.WebApi.Model.StartupLogger [(null)] - find api fileC:\Project\OpenAuth.Core\OpenAuth.WebApi\bin\Debug\netcoreapp3.1\temp-keys\key-1d85dca2-27e9-431f-97d3-3f455c7b8852.xml
2020-09-28 14:09:03,014 [5] ERROR Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware [(null)] - An unhandled exception has occurred while executing the request.
Autofac.Core.DependencyResolutionException: An exception was thrown while activating OpenAuth.App.SSO.LocalAuth -> OpenAuth.App.AuthContextFactory -> OpenAuth.App.SystemAuthStrategy -> OpenAuth.Repository.UnitWork -> OpenAuth.Repository.OpenAuthDBContext -> λ:Microsoft.EntityFrameworkCore.DbContextOptions`1[[OpenAuth.Repository.OpenAuthDBContext, OpenAuth.Repository, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]].
---> System.ArgumentNullException: Value cannot be null. (Parameter 'connectionString')
at Microsoft.EntityFrameworkCore.Utilities.Check.NotEmpty(String value, String parameterName)
at Microsoft.EntityFrameworkCore.SqlServerDbContextOptionsExtensions.UseSqlServer(DbContextOptionsBuilder optionsBuilder, String connectionString, Action`1 sqlServerOptionsAction)
at OpenAuth.WebApi.Startup.<>c__DisplayClass7_0.<ConfigureServices>b__5(DbContextOptionsBuilder options) in C:\Project\OpenAuth.Core\OpenAuth.WebApi\Startup.cs:line 141
at Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c__DisplayClass1_0`2.<AddDbContext>b__0(IServiceProvider p, DbContextOptionsBuilder b)
at Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.CreateDbContextOptions[TContext](IServiceProvider applicationServiceProvider, Action`2 optionsAction)
at Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c__DisplayClass10_0`1.<AddCoreServices>b__0(IServiceProvider p)
at Autofac.Extensions.DependencyInjection.AutofacRegistration.<>c__DisplayClass3_0.<Register>b__0(IComponentContext context, IEnumerable`1 parameters)
at Autofac.Core.Activators.Delegate.DelegateActivator.ActivateInstance(IComponentContext context, IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.CreateInstance(IEnumerable`1 parameters)
--- End of inner exception stack trace ---
at Autofac.Core.Resolving.InstanceLookup.CreateInstance(IEnumerable`1 parameters)
at Autofac.Core.Resolving.InstanceLookup.Execute()
at Autofac.Core.Resolving.ResolveOperation.GetOrCreateInstance(ISharingLifetimeScope currentOperationScope, ResolveRequest request)
at Autofac.Core.Resolving.ResolveOperation.ResolveComponent(ResolveRequest request)
at Autofac.Core.Resolving.ResolveOperation.Execute(ResolveRequest request)
at Autofac.Core.Lifetime.LifetimeScope.ResolveComponent(ResolveRequest request)
at Autofac.ResolutionExtensions.TryResolveService(IComponentContext context, Service service, IEnumerable`1 parameters, Object& instance)
at Autofac.ResolutionExtensions.ResolveOptionalService(IComponentContext context, Service service, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType, IEnumerable`1 parameters)
at Autofac.ResolutionExtensions.ResolveOptional(IComponentContext context, Type serviceType)
at Autofac.Extensions.DependencyInjection.AutofacServiceProvider.GetService(Type serviceType)
at Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider sp, Type type, Type requiredBy, Boolean isDefaultParameterRequired)
at lambda_method(Closure , IServiceProvider , Object[] )
at Microsoft.AspNetCore.Mvc.TypeFilterAttribute.CreateInstance(IServiceProvider serviceProvider)
at Microsoft.AspNetCore.Mvc.Filters.DefaultFilterProvider.ProvideFilter(FilterProviderContext context, FilterItem filterItem)
at Microsoft.AspNetCore.Mvc.Filters.DefaultFilterProvider.OnProvidersExecuting(FilterProviderContext context)
at Microsoft.AspNetCore.Mvc.Filters.FilterFactory.CreateUncachedFiltersCore(IFilterProvider[] filterProviders, ActionContext actionContext, List`1 filterItems)
at Microsoft.AspNetCore.Mvc.Filters.FilterFactory.GetAllFilters(IFilterProvider[] filterProviders, ActionContext actionContext)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvokerCache.GetCachedResult(ControllerContext controllerContext)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvokerProvider.OnProvidersExecuting(ActionInvokerProviderContext context)
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionInvokerFactory.CreateInvoker(ActionContext actionContext)
at Microsoft.AspNetCore.Mvc.Routing.ActionEndpointFactory.<>c__DisplayClass7_0.<CreateRequestDelegate>b__0(HttpContext context)
at Microsoft.AspNetCore.Routing.EndpointMiddleware.Invoke(HttpContext httpContext)
--- End of stack trace from previous location where exception was thrown ---
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

View File

@@ -45,6 +45,7 @@
版本附赠VIP服务提供VIP专属QQ群企业报销凭据、专属内部文档、技术咨询服务等。[如何获取请查看这里](http://openauth.me/question/detail.html?id=a2be2d61-7fcb-4df8-8be2-9f296c22a89c)快加入VIP大家庭 **与有理想的.NET开发者一起成长**
效果如下:
![API启动效果图](https://images.gitee.com/uploads/images/2021/0422/012037_ec51b7e6_362401.png "api启动.png")
![](https://images.gitee.com/uploads/images/2021/0128/224913_6bda2388_362401.png "form.png")
![](https://images.gitee.com/uploads/images/2021/0128/225024_57595ce9_362401.png "flow.png")