【发布时间】:2019-04-28 03:25:30
【问题描述】:
我正在更新一个旧项目以使用 .net 471 而不是 462 和所有 nuget 包的最新版本。
我有很多版本控制问题需要解决,但我终于得到了一个可以构建的项目。
但是,当我执行编程时,我得到了这个异常:
System.TypeAccessException: '尝试通过安全透明方法 'Autofac.Integration.WebApi.RegistrationExtensions.RegisterApiControllers(Autofac.ContainerBuilder, System.Reflection.Assembly[])' 访问安全关键类型 'Autofac.Builder.IRegistrationBuilder`3' 失败了。
紧随其后
Assembly 'Autofac.Integration.WebApi,版本=3.0.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da' 标有 AllowPartiallyTrustedCallersAttribute,并使用 2 级安全性 透明度模型。 2 级透明度导致所有方法在 AllowPartiallyTrustedCallers 程序集变得安全透明 默认情况下,这可能是导致此异常的原因。'
调用时会发生这种情况:
builder.RegisterApiControllers(ThisAssembly);
builder 是Autofac ContainerBuilder。
问题
就像题主说的,SecurityCritical和AllowPartiallyTrustedCallersAttribute之间一定有某种冲突,但我不知道我是怎么介绍的,最好的做法是什么,所以
发生了什么,我该如何解决?
更新
根据 JLe 的建议,我删除了 webapi 引用并改用 webapi2。我的日志记录设置出现了一个相关错误,但由于这不是“核心功能”,我现在跳过它(我需要回到那个)看看我会得到什么。我进入浏览器屏幕,它给了我这个:
方法 'my.namespace.MyController+d__6.MoveNext()' 是 安全透明,但属于安全关键类型。
我尝试将[SecurityCritical] 放在控制器类上,但显然您不允许在具有该属性的类中进行异步调用:
错误 CS4031 接口、类或接口中不允许使用异步方法 具有“SecurityCritical”或“SecuritySafeCritical”的结构 属性。
但我无法修复这个问题,因为我正在对后端 (NServicebus ESB) 进行异步调用。
【问题讨论】:
-
我只是在猜测,但 Autofac.WebApi2 包是用于 WebApi2 的,所以我可能是旧包创建了一些版本冲突,导致您的异常。你能试着把旧的删掉吗?
-
我刚试过,但是
RegisterApiControllers和AutofacWebApiDependencyResolver需要webapi。 -
您是否尝试过清洁您的解决方案? WebApi2 包也应该包含那些,版本 4.2.0。它的实际命名空间是相同的,Autofac.Integration.WebApi,即使它是版本 2。
-
@JLe:您关于清理软件包的建议最终修复了它(确保我使用的是 webapi2)。你能写一个答案让我接受吗?
标签: c# asp.net .net asp.net-web-api2 autofac