前言
为了方便开发轻量级WebApi服务,作者早在 .NET Framework 4.5 的时候就提供了 UniversalFrame。但是因为.NET Framework Web 需要在iis上搭建,并不能达到轻量级的运行,于是转移战场到了 .NET Core 至此达到了高效轻量。
示例
为了更好的让大家理解,我已经提供了一个 Git 仓库,上面有一份代码,方便大家理解。
项目地址: https://github.com/ni-xue/UniversalFrame
控制器
接下来创建控制器。
这里先介绍使用 MinApi 抽象类实现
今天主要是讲 MinApi 的概念。
简单理解:
public class Servers : MinApi
{
public IApiOut Get() //正常实现
{
return ApiOut.Json(new { msg = "暂无数据。", code = 200 });
}
public async Task<IApiOut> GetAsync() //异步实现
{
return await ApiOut.JsonAsyn(new { msg = "暂无数据。", code = 200 });
}
}
难度升级,通过使用 Ashx 接口属性来管理,接口使用方式。
public class Servers : MinApi //Servers 是类名也是接口名: 对应地址:Api/{controller=Services}/{action=GetMail} = Api/Servers/Get1
{
[Ashx(ID = "Get1", State = AshxState.Post)]//ID 对应的 接口别名, State 对应接口调用类型
public IApiOut Get(int s)//对应请求的参数。post方式就是从表单中获取,get以此类推。
{
return ApiOut.Json(new { msg = "暂无数据。", code = 200 });
}
public async Task<IApiOut> GetAsync() //异步实现
{
return await ApiOut.JsonAsyn(new { msg = "暂无数据。", code = 200 });
}
}
统一的管理接口函数,类似于MVC的过滤器,诞生了。
public class Servers : MinApi //Servers 是类名也是接口名: 对应地址:Api/{controller=Services}/{action=GetMail} = Api/Servers/Get1
{
protected override bool Initialize(AshxRouteData ashxRoute, out IApiOut aipOut)
{
//ashx 对象下面包含了,每个接口请求所需的信息。
//ashx.TryGetValue() 方法可以获取自己实现的 自定义属性 Attribute。
//实现自定义效果,接下来是一个示例:
//当进入这个if,我们可以认为,当前调用的接口,需要验证身份。
if (Session.TryGetValue("User", out User user1))
{
//当进入这个if,我们可以认为,当前能从Session取出 User 对象。这个对象是登录的时候存进去的。
}
else
{
//这里表示无法从Session取出 User 对象。 哪我们就不能让其调用接口。
aipOut = ApiOut.Json(new { code = 500, msg = "用户未登录!" });
return false;//取消后面的流程。
}
}
aipOut = null;
return true; //这里表示无需授权的接口,任意调用。
}
[Ashx(ID = "Get1", State = AshxState.Post)]//ID 对应的 接口别名, State 对应接口调用类型
public IApiOut Get(int s)//对应请求的参数。post方式就是从表单中获取,get以此类推。
{
return ApiOut.Json(new { msg = "暂无数据。", code = 200 });
}
[IsUser]//表示当前接口需要授权
public async Task<IApiOut> GetAsync() //异步实现
{
return await ApiOut.JsonAsyn(new { msg = "暂无数据。", code = 200 });
}
}
/// <summary>
/// 是否需要登录授权才能使用
/// </summary>
public class IsUser : Attribute
{
//这里可以定义自己的属性,我这里不需要
}
/// <summary>
/// 表示一个用户类,实体
/// </summary>
public class User
{
public int Id { set; get; }
public string Name { set; get; }
}
统一的错误收集方法,使用
public class Servers : MinApi
{
public IApiOut Get() //正常实现
{
return ApiOut.Json(new { msg = "暂无数据。", code = 200 });
}
public async Task<IApiOut> GetAsync() //异步实现
{
return await ApiOut.JsonAsyn(new { msg = "暂无数据。", code = 200 });
}
}
难度升级,通过使用 Ashx 接口属性来管理,接口使用方式。
public class Servers : MinApi //Servers 是类名也是接口名: 对应地址:Api/{controller=Services}/{action=GetMail} = Api/Servers/Get1
{
[Ashx(ID = "Get1", State = AshxState.Post)]//ID 对应的 接口别名, State 对应接口调用类型
public IApiOut Get(int s)//对应请求的参数。post方式就是从表单中获取,get以此类推。
{
return ApiOut.Json(new { msg = "暂无数据。", code = 200 });
}
public async Task<IApiOut> GetAsync() //异步实现
{
return await ApiOut.JsonAsyn(new { msg = "暂无数据。", code = 200 });
}
}
统一的管理接口函数,类似于MVC的过滤器,诞生了。
public class Servers : MinApi //Servers 是类名也是接口名: 对应地址:Api/{controller=Services}/{action=GetMail} = Api/Servers/Get1
{
protected override bool Initialize(AshxRouteData ashxRoute, out IApiOut aipOut)
{
//ashx 对象下面包含了,每个接口请求所需的信息。
//ashx.TryGetValue() 方法可以获取自己实现的 自定义属性 Attribute。
//实现自定义效果,接下来是一个示例:
//当进入这个if,我们可以认为,当前调用的接口,需要验证身份。
if (Session.TryGetValue("User", out User user1))
{
//当进入这个if,我们可以认为,当前能从Session取出 User 对象。这个对象是登录的时候存进去的。
}
else
{
//这里表示无法从Session取出 User 对象。 哪我们就不能让其调用接口。
aipOut = ApiOut.Json(new { code = 500, msg = "用户未登录!" });
return false;//取消后面的流程。
}
}
aipOut = null;
return true; //这里表示无需授权的接口,任意调用。
}
// 异常监听收集器,用于处理异常的问题。
protected override IApiOut AshxException(AshxException ex)
{
Log.Error($"Services->{ex.Methods}", ex, LogFilePath);//收集错误日志
return ApiOut.Json(new { msg = "发生异常。" });
}
[Ashx(ID = "Get1", State = AshxState.Post)]//ID 对应的 接口别名, State 对应接口调用类型
public IApiOut Get(int s)//对应请求的参数。post方式就是从表单中获取,get以此类推。
{
return ApiOut.Json(new { msg = "暂无数据。", code = 200 });
}
[IsUser]//表示当前接口需要授权
public async Task<IApiOut> GetAsync() //异步实现
{
return await ApiOut.JsonAsyn(new { msg = "暂无数据。", code = 200 });
}
}
/// <summary>
/// 是否需要登录授权才能使用
/// </summary>
public class IsUser : Attribute
{
//这里可以定义自己的属性,我这里不需要
}
/// <summary>
/// 表示一个用户类,实体
/// </summary>
public class User
{
public int Id { set; get; }
public string Name { set; get; }
}
重点概念
MinApi 下面的所有类成员都会被成为公共变量,这表示 MinApi 类下面的公共成员是非线程安全的,请合理的创建使用 这些类 成员,他可以有效的提高你程序性能。
总结
以上完成了 对 MinApi Api 的基本实现,已经可以正常使用了。
作者将在下一篇文章中介绍,相关方法函数的使用,以及对注册的服务的使用。
同时希望大家给出见解。
欢迎转载。