.Net WebApi 反射调用多个接口
/// <summary>
/// 接口工厂
/// </summary>
public class APIFactoryController : BaseApiController
{
/// <summary>
/// 控制器缓存
/// </summary>
private static readonly IList<ControllerCacheModel> ControllerList = new List<ControllerCacheModel>();
static APIFactoryController()
{
foreach (Assembly item in PublicVars.WebAppAssemblys)
{
foreach (Type controller in item.GetTypes().Where(p => p.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)))
{
ControllerList.Add(new ControllerCacheModel()
{
Name = controller.Name,
Type = controller,
HaveLoginAttr = controller.CustomAttributes.Any(p => p.AttributeType == typeof(AuthorizeAttribute))
});
}
}
}
/// <summary>
/// 统一请求接口(★☆★将所有get请求合并为一个请求后通过该接口一次调用★☆★)
/// </summary>
/// <param name="model">请求参数</param>
/// <returns>数据处理结果</returns>
[Route("api/APIFactory")]
[CompressionFilter]
public async Task<IHttpActionResult> PostAsync(List<ReqPublicFun> model)
{
return await Task.Run(() => { return HandleReqData(model); });
}
/// <summary>
/// 数据处理
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
private IHttpActionResult HandleReqData(List<ReqPublicFun> model)
{
BaseResult<Dictionary<string, object>> rel = new BaseResult<Dictionary<string, object>>() { Data = new Dictionary<string, object>() };
string[] urlArr;
string methodName;
ControllerCacheModel chController;
MethodCacheModel chMethod;
MethodInfo method;
ParameterInfo[] methodPram;
Object[] invokeParas;
ReqParam reqParam;
bool hasReqParam;
bool isLogined = Thread.CurrentPrincipal.Identity.IsAuthenticated;
//控制器对象
Dictionary<string, object> objListController = new Dictionary<string, object>();
object objController = null;
foreach (ReqPublicFun item in model)
{
#region 调用前验证
urlArr = item.Url.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
//获取类
chController = ControllerList.FirstOrDefault(p => p.Name.Equals(urlArr[0] + "Controller", StringComparison.OrdinalIgnoreCase));
if (chController == null)
{
return Content(HttpStatusCode.NotFound, item.Flag + "==>接口地址错误");
}
objController = objListController.FirstOrDefault(p => p.Key == chController.Name).Value;
if (objController == null)
{
objController = AutofacHelper.Resolve(chController.Type);
objListController.Add(chController.Name, objController);
}
//获取方法
methodName = urlArr[1];
chMethod = chController.Methods.FirstOrDefault(p => methodName.Equals(p.Name, StringComparison.OrdinalIgnoreCase));
if (chMethod == null)
{
method = chController.Type.GetMethod(methodName);
if (method == null)
{
return Content(HttpStatusCode.NotFound, item.Flag + "==>接口地址错误");
}
chMethod = new MethodCacheModel()
{
Name = methodName,
Method = method,
NotLoginAttr = method.CustomAttributes.Any(p => p.AttributeType == typeof(AllowAnonymousAttribute)),
HaveLoginAttr = method.CustomAttributes.Any(p => p.AttributeType == typeof(AuthorizeAttribute))
};
chController.Methods.Add(chMethod); //按需加载下次使用
}
else
{
method = chMethod.Method;
}
//登录判断
if (isLogined == false && chMethod.NotLoginAttr == false && (chController.HaveLoginAttr || chMethod.HaveLoginAttr))
{
return Content(HttpStatusCode.Unauthorized, item.Flag + "==>请先登录");
}
#endregion
#region 参数处理
methodPram = method.GetParameters();
if (methodPram.Length > 0)
{
hasReqParam = item.Param != null && item.Param.Length > 0;
invokeParas = new Object[methodPram.Length];
for (int i = 0; i < methodPram.Length; i++)
{
if (hasReqParam)
{
reqParam = item.Param.FirstOrDefault(p => p.Name.Equals(methodPram[i].Name, StringComparison.OrdinalIgnoreCase));
if (reqParam != null)
{
switch (methodPram[i].ParameterType.Name)
{
case "Guid":
invokeParas[i] = Guid.Parse(reqParam.Value.ToString());
break;
default:
invokeParas[i] = Convert.ChangeType(reqParam.Value, methodPram[i].ParameterType);
break;
}
continue;
}
}
if (methodPram[i].HasDefaultValue)
{
invokeParas[i] = methodPram[i].DefaultValue;
}
}
}
else
{
invokeParas = null;
}
#endregion
//方法调用(用了委托发现并无性能提升故使用原生方法)
rel.Data.Add(item.Flag, method.Invoke(objController, invokeParas));
}
return Json(rel, SerializeHelper.JsonSerializerSettings);
}
}
/// <summary>
/// 程序项目dll
/// </summary>
public static Assembly[] WebAppAssemblys => BuildManager.GetReferencedAssemblies().Cast<Assembly>().Where(p => p.GetName().Name.StartsWith("XX.Web.")).ToArray();

浙公网安备 33010602011771号