mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2025-07-19 07:44:59 +08:00
fix 动态api支持调用异步方法
This commit is contained in:
parent
8d031a701d
commit
bdd32d9d76
@ -7,6 +7,7 @@ using OpenAuth.App.Interface;
|
|||||||
using OpenAuth.App.Response;
|
using OpenAuth.App.Response;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using OpenAuth.App.Request;
|
using OpenAuth.App.Request;
|
||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
namespace OpenAuth.App
|
namespace OpenAuth.App
|
||||||
{
|
{
|
||||||
@ -20,11 +21,14 @@ namespace OpenAuth.App
|
|||||||
private readonly IAuth _auth;
|
private readonly IAuth _auth;
|
||||||
private readonly IServiceProvider _serviceProvider;
|
private readonly IServiceProvider _serviceProvider;
|
||||||
|
|
||||||
public DynamicApiApp(ISqlSugarClient client, IAuth auth, IServiceProvider serviceProvider)
|
private readonly ILogger<DynamicApiApp> logger;
|
||||||
|
|
||||||
|
public DynamicApiApp(ISqlSugarClient client, IAuth auth, IServiceProvider serviceProvider, ILogger<DynamicApiApp> logger)
|
||||||
{
|
{
|
||||||
_client = client;
|
_client = client;
|
||||||
_auth = auth;
|
_auth = auth;
|
||||||
_serviceProvider = serviceProvider;
|
_serviceProvider = serviceProvider;
|
||||||
|
this.logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -345,29 +349,29 @@ namespace OpenAuth.App
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="req">调用参数</param>
|
/// <param name="req">调用参数</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public object Invoke(InvokeDynamicReq req)
|
public async Task<object> Invoke(InvokeDynamicReq request)
|
||||||
{
|
{
|
||||||
var result = new object();
|
var result = new object();
|
||||||
|
|
||||||
// 获取服务类型
|
// 获取服务类型
|
||||||
var serviceType = Type.GetType($"OpenAuth.App.{req.ServiceName}, OpenAuth.App");
|
var serviceType = Type.GetType($"OpenAuth.App.{request.ServiceName}, OpenAuth.App");
|
||||||
if (serviceType == null)
|
if (serviceType == null)
|
||||||
{
|
{
|
||||||
throw new Exception($"未找到服务类型:{req.ServiceName}");
|
throw new Exception($"未找到服务类型:{request.ServiceName}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取服务实例
|
// 获取服务实例
|
||||||
var service = _serviceProvider.GetService(serviceType);
|
var service = _serviceProvider.GetService(serviceType);
|
||||||
if (service == null)
|
if (service == null)
|
||||||
{
|
{
|
||||||
throw new Exception($"无法获取服务实例:{req.ServiceName}");
|
throw new Exception($"无法获取服务实例:{request.ServiceName}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取方法信息
|
// 获取方法信息
|
||||||
var method = serviceType.GetMethod(req.MethodName);
|
var method = serviceType.GetMethod(request.MethodName);
|
||||||
if (method == null)
|
if (method == null)
|
||||||
{
|
{
|
||||||
throw new Exception($"未找到方法:{req.MethodName}");
|
throw new Exception($"未找到方法:{request.MethodName}");
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取方法参数信息
|
// 获取方法参数信息
|
||||||
@ -382,7 +386,7 @@ namespace OpenAuth.App
|
|||||||
// 尝试从JSON中获取参数值
|
// 尝试从JSON中获取参数值
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var json = req.Parameters;
|
var json = request.Parameters;
|
||||||
// 检查参数名是否存在于JSON中
|
// 检查参数名是否存在于JSON中
|
||||||
if (json.Contains($"\"{param.Name}\""))
|
if (json.Contains($"\"{param.Name}\""))
|
||||||
{
|
{
|
||||||
@ -414,18 +418,30 @@ namespace OpenAuth.App
|
|||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
// 记录错误日志
|
// 记录错误日志
|
||||||
Console.WriteLine($"反序列化参数 {param.Name} 失败: {ex.Message}");
|
logger.LogError($"反序列化参数 {param.Name} 失败: {ex.Message}");
|
||||||
// 反序列化失败,使用默认值
|
// 反序列化失败,使用默认值
|
||||||
paramValues[i] = param.HasDefaultValue ? param.DefaultValue : null;
|
paramValues[i] = param.HasDefaultValue ? param.DefaultValue : null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用参数数组调用方法
|
// 调用方法并处理返回值
|
||||||
result = method.Invoke(service, paramValues);
|
result = method.Invoke(service, paramValues);
|
||||||
|
|
||||||
|
// 如果返回值是Task
|
||||||
|
if (result is Task task)
|
||||||
|
{
|
||||||
|
await task; // 异步等待任务完成
|
||||||
|
|
||||||
|
// 获取Task的实际结果
|
||||||
|
var resultProperty = task.GetType().GetProperty("Result");
|
||||||
|
if (resultProperty != null)
|
||||||
|
{
|
||||||
|
return resultProperty.GetValue(task);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -56,11 +56,11 @@ namespace OpenAuth.App.Test
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestInvoke()
|
public async Task TestInvoke()
|
||||||
{
|
{
|
||||||
var app = _autofacServiceProvider.GetService<DynamicApiApp>();
|
var app = _autofacServiceProvider.GetService<DynamicApiApp>();
|
||||||
|
|
||||||
var obj = app.Invoke(new InvokeDynamicReq { ServiceName = "UserManagerApp", MethodName = "GetParent",
|
var obj = await app.Invoke(new InvokeDynamicReq { ServiceName = "UserManagerApp", MethodName = "GetParent",
|
||||||
Parameters = "{\"userid\":\"0ceff0f8-f848-440c-bc26-d8605ac858cd\"}" });
|
Parameters = "{\"userid\":\"0ceff0f8-f848-440c-bc26-d8605ac858cd\"}" });
|
||||||
Console.WriteLine(JsonHelper.Instance.Serialize(obj));
|
Console.WriteLine(JsonHelper.Instance.Serialize(obj));
|
||||||
}
|
}
|
||||||
@ -70,12 +70,12 @@ namespace OpenAuth.App.Test
|
|||||||
{
|
{
|
||||||
var app = _autofacServiceProvider.GetService<DynamicApiApp>();
|
var app = _autofacServiceProvider.GetService<DynamicApiApp>();
|
||||||
|
|
||||||
var obj = app.Invoke(new InvokeDynamicReq {
|
var obj = await app.Invoke(new InvokeDynamicReq {
|
||||||
ServiceName = "UserManagerApp",
|
ServiceName = "UserManagerApp",
|
||||||
MethodName = "Load",
|
MethodName = "Load",
|
||||||
Parameters = "{\"request\":{\"page\":1,\"limit\":10,\"key\":\"dddd\"}}"
|
Parameters = "{\"request\":{\"page\":1,\"limit\":10,\"key\":\"dddd\"}}"
|
||||||
});
|
});
|
||||||
Console.WriteLine(obj.ToString());
|
Console.WriteLine(JsonHelper.Instance.Serialize(obj));
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -155,12 +155,12 @@ namespace OpenAuth.WebApi.Controllers
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[AllowAnonymous]
|
[AllowAnonymous]
|
||||||
public Response<object> Invoke([FromBody] InvokeDynamicReq req)
|
public async Task<Response<object>> Invoke([FromBody] InvokeDynamicReq req)
|
||||||
{
|
{
|
||||||
var result = new Response<object>();
|
var result = new Response<object>();
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
result.Result = _app.Invoke(req);
|
result.Result = await _app.Invoke(req);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user