使用.NET Core搭建分布式音频效果处理服务(六)让Middleware自动Invoke
为何要用中间件来实现音频处理的监听服务
当然也可以使用Startup来进行服务的自启动,或者也可以使用quartz定时调度任务来启动音频服务,大家随意。
笔者认为使用中间件的目的,是为了分离应用和服务,也是一种解耦手段。
我们知道,在NETCORE中的中间件,有点类似像AOP的一种实现形式,他的调用方式是通过Request=>Middleware=>next=>custom logic=>Response。我们可以用来做日志记录、权限验证、事物处理,多个中间件形成一个处理管道,甚至可以实现自定义的MVC和依赖注入。
创建一个中间件
为了便于区分,我们扩展一个名为“MediaHandlers”的IApplicationBuilder
1 public static class MediaHandlers 2 { 3 public static IApplicationBuilder UseMediaAudioHandlerMiddleware(this IApplicationBuilder builder, 4 MediaAudioOptions options) 5 { 6 if (builder == null) 7 throw new ArgumentNullException(nameof(builder)); 8 9 return builder.UseMiddleware<MediaAudioMiddleware>(options); 10 } 11 }
再创建一个名为“MediaAudioMiddleware”的中间件,其实就是一个实现类,但需要传递对象RequestDelegate做请求代理。
并且,我们将在中间件中实现依赖注入,而中间件的依赖注入却无法通过构造函数的方式进行注入,需要通过Invoke来实现依赖注入,完整代码如下:
1 public async Task Invoke(HttpContext context, 2 IDataOpService iDataOpService, 3 ICacheAsyncService iCacheAsyncService, 4 IMsgBusService imsgBusService, 5 IHostingEnvironment iHostingEnvironment) 6 { 7 _dataOpService = iDataOpService; 8 _iMsgBusService = imsgBusService; 9 _iCacheAsyncService = iCacheAsyncService; 10 _ihostingEnvironment = iHostingEnvironment; 11 12 await _next(context); 13 }
跟之前的控制器注入的内容类型是一样的。然后我们再来看看构造函数中需要实现的一些事情:
public MediaAudioMiddleware(RequestDelegate next, MediaAudioOptions options) { _next = next; Task.Factory.StartNew(() => { Thread.Sleep(3 * 1000); //...需要自定义启动的方法 }); }
构造函数中默认必须传递RequestDelegate类型参数,用于委托执行Request之后Response之前的代理。
将需要启动的服务已子任务(子线程)的方式交给Task工厂进行自行管理,再次分离了主管道请求应用。
但是,默认这个中间件是不会自动启动的。。。因为没有建立一个请求管道。
强制建立一个请求管道
笔者的思路是,通过httpclient请求主管道中的一个任意的API接口(比如你自定义实现的服务器信息接口),从而强制实现该请求管道的所有事情,比如循环,比如监听等等。参考如下:
1 using (var httpClient = new HttpClient()) 2 { 3 httpClient.BaseAddress = new Uri($"{General.LocalHostUrl}/Info"); 4 var r = httpClient.GetAsync(httpClient.BaseAddress).Result; 5 if (!r.ToString().Contains("200")) return; 6 Console.WriteLine("MediaAudioMiddleware Running"); 7 var mediaHandler = new AudioHandlerWorkUnit(iDataOpService: _dataOpService, 8 iCacheAsyncService: _iCacheAsyncService, 9 imsgBusService: _iMsgBusService, 10 iHostingEnvironment: _ihostingEnvironment, 11 millsSeconds: options.MillsSeconds 12 ); 13 mediaHandler.DoStart(); 14 }
当然,需要在命令参数中(或前置参数中约束该管道只建立一次),也许笔者的实现方式欠妥,如果你有更好的方法,欢迎交流。
感谢阅读

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
云计算虚拟化USB设备集中管理、远程共享解决方案(涉及银企直联)
技术需求:1.企业员工的大量USB Key,需要将key接入USB Server虚拟池,进行集中管理。2.设置USB Key最高管理员,本管理员权限:在Server端可以对Key的端口进行描述符修改,并可以做到即使Server上USB端口没有插入USB设备,仍然可以对端口进行描述符修改;可以对已经被客户端连接的key进行断开操作;对客户端连接进行授权、撤销授权、更改授权;对最高管理员的操作进行日志记录;客户端与USBkey的连接进行日志记录。3.独立的第三方日志服务器,通过日志服务器进行单独授权,非授权情况下日志内容无法篡改和删减;日志需要记录最高管理员对Server和Key的操作(操作时间、操作内容)、用户远程使用key的操作(操作时间、动作、操作主机编号)。4.客户端支持以电脑主机硬件唯一编码为验证码进行自动登陆,实现硬件绑定;被最高管理员授权的唯一编码可以看到被授权的USB设备或USB端口并连接使用或者断开;未被授权的客户端无法看到相应的设备列表;客户端也有单独的日志进行操作记录,存放在电脑本地。技术难点:保证USB Key在使用过程中的高度稳定性;USB Server设备池,硬...
-
下一篇
CoreGraphic 框架解析
CoreGraphic框架解析(一)—— 基本概览CoreGraphic框架解析(二)—— 基本使用CoreGraphic框架解析(三)—— 类波浪线的实现CoreGraphic框架解析(四)—— 基本架构补充
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- 设置Eclipse缩进为4个空格,增强代码规范
- 面试大杂烩
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)