强制第三方组件使用其他组件的另一个版本

问题描述:

我运行集成测试,当我到达那行代码:强制第三方组件使用其他组件的另一个版本

 WebApiDependencyResolverConfig.Register(config); 

(使用autofac容器内)

我得到这个例外:

{"Could not load file or assembly 'System.Web.Http, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)":"System.Web.Http, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"} 

Fusionlog:

=== Pre-bind state information === 
LOG: DisplayName = System.Web.Http, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 
(Fully-specified) 
LOG: Appbase = file:///C:/TLP/TLP.API.IntegrationTests/bin/Debug 
LOG: Initial PrivatePath = NULL 
Calling assembly : Autofac.Integration.WebApi, Version=3.0.0.0, Culture=neutral, PublicKeyToken=17863af14b0044da. 
=== 
LOG: This bind starts in default load context. 
LOG: Using application configuration file: C:\TLP\TLP.API.IntegrationTests\bin\Debug\TLP.API.IntegrationTests.dll.config 
LOG: Using host configuration file: 
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework64\v4.0.30319\config 

似乎autofac web api集成仅适用于web api 2.0。 当我使用web api 2.1,它不再引用system.web.http 5.0.0,而是5.1.0,它不再工作。

如何告诉autofac使用system.web.http 5.1.0版本而不是5.0.0?

我把这个在我的集成测试和API项目的app.config:

<runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
    <dependentAssembly> 
     <assemblyIdentity name="System.Web.Http" 
         publicKeyToken="32ab4ba45e0a69a1" 
         culture="neutral" /> 
     <bindingRedirect oldVersion="5.0.0.0" 
         newVersion="5.1.0.0"/> 
    </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 

,但它没有工作!

另一件很奇怪的事情是,我已经读过使用.NET 4.5.1这个重定向组件的东西是自动完成的。但它不会发生......

正如所解释的hereherehere,你有一个公钥令牌不匹配,当引用的组件与不同的强名称密钥重新编译引起的。

除了通过针对较新的程序集编译autofac库之外,无法解决这个问题。

+0

那么,谁应该责怪?微软用于制造System.Web.Http公钥的垃圾吗? – Pascal

+0

关于你的最后一句话:这不应该是autofac作者的任务吗?我问这是因为我想将此修复程序作为nuget软件包。不是我自己添加的一些自定义引用... – Pascal

+1

@Pascal我已验证Web API 2和2.1匹配的publicKeyTokens。你可以尝试在配置中将'32ab4ba45e0a69a1'更改为'31bf3856ad364e35'吗?如果令牌会发生变化,那么是的,autofac人员应该发布更新,但看起来情况并非如此。 – CodeCaster

我已经将更新的软件包推送到NuGet for Web API 2.1和MVC 5.1。

http://www.nuget.org/packages/Autofac.WebApi2

https://www.nuget.org/packages/Autofac.Mvc5

微软显然解释语义版本不同的规则,因为5.1是一个小版本,应该“以向后兼容的方式添加功能”。 5.1.0包的情况并非如此,因为强大的指定程序集版本增加了。

Autofac程序集是强命名的,但在3.0系列版本中,只更新了程序包和文件版本。程序集版本始终保持在3.0.0.0以防止程序包更新期间发生这种中断更改。不幸的是,我们无法控制ASP.NET依赖关系,并且在发生类似事件时必须重新编译。

+0

谢谢亚历克斯,好,我包括我的问题与“autofac”标记;-)测试新的nuget,它的工作原理! – Pascal