加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-web-api – SimpleInjector RegisterWebApiRequest vs R

发布时间:2020-12-16 03:59:31 所属栏目:asp.Net 来源:网络整理
导读:最新版本的SimpleInjector引入了MVC和WebApi之间的区别.两个请求注册是否为同一个东西的别名?或者是否存在潜在的差异? 谢谢 解决方法 SimpleInjector 2.5中的生活方式和范围实现WebRequest和WebApiRequest基于不同的技术. WebApiRequestLifestyle派生自Exe
最新版本的SimpleInjector引入了MVC和WebApi之间的区别.两个请求注册是否为同一个东西的别名?或者是否存在潜在的差异?

谢谢

解决方法

SimpleInjector 2.5中的生活方式和范围实现WebRequest和WebApiRequest基于不同的技术.

WebApiRequestLifestyle派生自ExecutionContextScopeLifestyle,它在IIS内部和外部都能很好地工作.即它可以在没有HttpContext.Current的自托管WebAPI项目中运行. WebApiRequestLifestyle使用的范围是ExecutionContextScope.顾名思义,ExecutionContextScope在逻辑调用上下文中注册自身,并在线程之间进行异步操作(例如,在等待不同线程之后的延续仍然可以访问范围,无论ConfigureAwait()是使用true还是false).

相反,WebRequestLifestyle的实例存储在HttpContext中. HttpContext可以在IIS中托管时与WebAPI一起使用,但必须小心,因为它不会始终与执行上下文一起流动,因为当前的HttpContext存储在IllogicalCallContext中(参见Understanding SynchronizationContext in ASP.NET).如果对ConfigureAwait(false)使用await,则只要async-op不同步执行,延续就可能会丢失对原始HttpContext的跟踪.这样做的直接影响是,不再可能使用WebRequestLifestyle从容器中解析以前创建的服务的实例(例如,在有权访问容器的工厂中) – 并且因为HttpContext.Current而抛出异常将是null.

我建议您使用WebApiRequestLifestyle进行“按Web API请求”的服务,最明显的例子是注入WebAPI控制器的服务. WebApiRequestLifestyle具有以下优点:

> WebAPI控制器可以在IIS之外使用(例如,在自托管项目中)
> WebAPI控制器可以执行自由线程(或多线程)异步方法,因为它不仅限于ASP.net SynchronizationContext.

查看Stephen Toub关于difference between ExecutionContext and SynchronizationContext的博客文章.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读