并发离线安全问题详解 净芯
抱歉,内容不如标题!
背景(写测试演示异常,供大家学习和拍砖):
那个。net core webapi项目做了一个授权的过滤器(如果是真正的制作项目,JWT很棒),测试单个接口没有问题。当使用前端在同一个页面上调用多个接口时,运行服务,打开页面,然后.……例外情况…….(大家在实际开发中也应该会遇到)
异常1:试图在配置上下文时使用它。配置时不能在内部使用数据库上下文实例,因为此时仍在配置它。如果在前一个操作完成之前,在此上下文中启动了第二个操作,就会发生这种情况。任何实例成员都不能保证是线程安全的。
异常2:在前一个操作完成之前,在此上下文上开始了第二个操作。任何实例成员都不能保证是线程安全的。
异常3:读取器关闭时调用read的尝试无效。
异常4:无法强制转换“system”类型的对象。data . provider base . dbconnectionlosedconnecting ' to type '系统。data . sqlclient . sqlinternalconnectionds '。
异常5:对象引用未设置为对象的实例。
异常6:不允许启动新事务,因为会话中有其他线程正在运行。
异常7:更新条目时出错。有关详细信息,请参见内部异常。
尝试运行n次,嗯,相当不稳定(代码垃圾!),那就看破格了
乍一看,很容易理解第二个操作是在前一个操作完成之前在这个上下文中开始的。不能保证任何实例成员都是线程安全的。也就是说,当我使用这个上下文时,你会偷我的屁股.
这可能发生在并发的情况下,并且同时使用相同的上下文.为什么在打开一个页面的同时使用相同的上下文?好吧,在这里我得负荆请罪(可以说是我自己的问题)
我在Filter中有一个查询,并使用数据库上下文DbContext。罪恶,我想直接在过滤器里过滤黑名单,所以查了数据库(这个业务不合理,这是死亡行为,请谨慎对待,这里供学习讨论)。
公共类AuthFilterAttribute : ActionFilterAttribute { public override void on actionexecuting(actionexecuting context){ base }。OnActionExecuting(上下文);//判断是否在黑名单var黑名单=_app中。get黑名单();}}为什么在这里使用ActionFilterAttribute?因为测试的时候要监控界面操作的全过程,所以……
然后有一些错误:对象引用没有被设置为对象的实例。这个错误太常见了。对象不是Null吗?但是,业务逻辑中有太多未初始化对象的实例。我的应该有:
1.未获得当前对象。这是。网芯,不是。net,并不是因为没有新的对象。是的,注射不成功。注射获得后,没有获得。(但是我运行得很好,因为问题出现在我打开停靠页面的时候,可以排除。)
2.已经实例化的对象已经被回收.(有可能.这是可能的,但它发生在哪里?)
看啊看,其实是有方向的,只是我自己不记得了.
其实不确定的话可以先搞清楚别人怎么说(不是安装X,要找开发问题,我推荐github和stackoverflow,大部分问题都能找到):
(1)例外1具有相同的搜索结果
(2)例外2
虽然上面的搜索不一定是真正的答案,但它至少提供了一个方向,你至少可以尝试解决它。这里提供的方向其实很明确:
1.是否应该使用Scoped和Transient,但是使用Singleton;
2.异步用于多线程,但等待;未配对;
至少我找到的关键点就是这两个。
那么如何发现和解决这个问题,注入了net core,也注入了AuthFilterAttribute。当我运行到Startup时,很明显问题出在哪里——一个单独的案例!它应该是限定范围的,但是使用了一个单独的案例。
然后将AuthFilterAttribute更改为另一种注入模式。
代替
我用有自己生命周期的Filter来确认:Filter的官方文档
看到一张图片!(当然,你也可以仔细研究这份文件)如下:
这不是很明显吗?
过滤器将被回收!这也解释了异常3、4、5、6和7的原因。
好了,问题解决了。这是开发中遇到的一个问题,可以说涉及到的运行机制。网芯本身。
我是一个面向应用的程序员,喜欢学习应用中的底层东西。那么我们当然可以扩展单例、限定范围和瞬态的知识。
摘要
以上就是本文的全部内容。希望本文的内容对大家的学习或工作有一定的参考价值。谢谢你的支持。
版权声明:并发离线安全问题详解 净芯是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。