在 .NET Core 中结合 UniversalFrame.Core 开发轻量级 WebApi(中篇)

搭建轻量高效的Web服务

前言

为了方便开发轻量级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 的基本实现,已经可以正常使用了。
作者将在下一篇文章中介绍,相关方法函数的使用,以及对注册的服务的使用。

同时希望大家给出见解。

欢迎转载。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值