using medical.insu.transfomer.Attributes;
using ReZero.SuperAPI;
using System;
using System.Linq;
using System.Reflection;
namespace medical.insu.transfomer
{
///
/// 定义不需要登录验证的API路径
///
public static class NoAuthPaths
{
///
/// 医保交易接口
///
public const string MedicalInsuranceExecuteTransaction = "/api/200100/medicalinsurancecontroller/executetransaction";
///
/// 检查路径是否在免验证列表中
///
/// 请求路径
/// true表示不需要验证
public static bool IsNoAuthPath(string path)
{
path = path.ToLower();
// 检查是否匹配医保交易接口
if (path.Contains(MedicalInsuranceExecuteTransaction))
{
Console.WriteLine($"路径匹配医保交易接口: {path}");
return true;
}
// 如果需要添加更多免验证路径,可以在这里扩展
// 添加更多需要跳过验证的接口
if (path.Contains("/api/200100/medicalinsurancecontroller/"))
{
Console.WriteLine($"所有医保接口跳过验证: {path}");
return true;
}
return false;
}
///
/// 通过特性检查是否需要验证
///
/// 接口上下文
/// true表示不需要验证
public static bool IsSkipAuthByAttribute(InterfaceContext context)
{
var path = context.HttpContext.Request.Path;
Console.WriteLine($"检查路径是否需要验证: {path}");
// 先检查路径
if (IsNoAuthPath(path))
{
Console.WriteLine($"路径已跳过验证: {path}");
return true;
}
try
{
// 检查具体接口信息
if (context.InterfaceInfo?.DataModel?.MyMethodInfo != null)
{
var methodInfo = context.InterfaceInfo.DataModel.MyMethodInfo;
var classFullName = methodInfo.MethodClassFullName;
var methodName = methodInfo.MethodName;
Console.WriteLine($"检查接口信息: {classFullName}.{methodName}");
if (!string.IsNullOrEmpty(classFullName) && !string.IsNullOrEmpty(methodName))
{
// 获取所有程序集
var assemblies = AppDomain.CurrentDomain.GetAssemblies();
foreach (var assembly in assemblies)
{
try
{
// 查找类型
if (!assembly.FullName.Contains("medical") &&
!assembly.FullName.Contains("SuperAPI"))
continue;
var type = assembly.GetType(classFullName);
if (type != null)
{
Console.WriteLine($"找到类型: {type.FullName}");
// 检查类是否有SkipAuthAttribute
if (type.GetCustomAttributes(typeof(SkipAuthAttribute), true).Any())
{
Console.WriteLine($"类型有SkipAuthAttribute: {type.FullName}");
return true;
}
// 查找方法
var method = type.GetMethod(methodName);
if (method != null)
{
Console.WriteLine($"找到方法: {method.Name}");
// 检查方法是否有SkipAuthAttribute
if (method.GetCustomAttributes(typeof(SkipAuthAttribute), true).Any())
{
Console.WriteLine($"方法有SkipAuthAttribute: {method.Name}");
return true;
}
}
else
{
Console.WriteLine($"找不到方法: {methodName}");
}
}
}
catch (Exception ex)
{
// 忽略查找过程中的异常
Console.WriteLine($"查找程序集时发生异常: {assembly.FullName}, 错误: {ex.Message}");
continue;
}
}
}
}
else
{
Console.WriteLine("接口信息为空");
}
}
catch (Exception ex)
{
// 捕获任何异常,防止验证过程崩溃
Console.WriteLine($"检查免验证特性时发生异常: {ex.Message}, 堆栈: {ex.StackTrace}");
}
Console.WriteLine($"需要验证: {path}");
return false;
}
}
}