System.Web.Http 中的向后兼容性中断
Broken Backward Compatibility in System.Web.Http
我有这样一种情况,我在一个客户端应用程序中有一些代码在一个以 .net4.0 为目标的程序集中使用了 System.Web.Http.SelfHost.HttpSelfHostServer
,结果依赖于 [=14 的 v4.0.0.0 =]
我在服务器上还有一些其他代码,它是一个 webApi,目标是 .net4.6.1。此程序集依赖于 System.Web.Htpp.dll
v5.2.3
一切正常。
但后来我来写一个自动化集成测试(作为单元测试),其中过程需要实例化系统的两个部分(没有 IIS 之类的脚手架)。单元测试程序集必须是 .net4.6.1(因为它依赖于服务器端程序集)。这意味着单元测试程序集中对 System.Web.Http
的引用将 v5.2.3 带入其 bin 文件夹。
在运行时,这会导致 ReflectionTypeLoadException
和 LoaderException
"{"Inheritance security rules violated by type: 'System.Web.Http.SelfHost.HttpSelfHostConfiguration'. Derived types must either match the security accessibility of the base type or be less accessible.":"System.Web.Http.SelfHost.HttpSelfHostConfiguration"}"
在我的app.config(用于单元测试程序集)中我有一个运行时重定向:
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
这意味着我的 .net4 依赖项被迫使用 System.Web.Http 的 v5.2.3。
如果没有此运行时重定向,客户端程序集会抱怨缺少依赖项(System.Web.Http
v4.0.0.0),如果我在 bin 目录中有 System.Web.Http
的 v4.0.0.0 (但不是 v5.2.3)然后服务器端程序集抱怨缺少依赖项。
有什么办法可以解决这个问题吗?在我看来 System.Web.Http
v5.2.3 不向后兼容。
这比上面看起来简单多了。客户端代码是使用 System.Web.Http.SelfHost.HttpSelfHostServer
的代码,因此它将程序集 System.Web.Http.SelfHost.dll
拉入 bin 目录。
单元测试程序集正在引入 System.Web.Http.dll
,因为它和服务器端都需要它。
selfhost dll 是 v4.0.0.0,system.web.http 是 v5.2.3。这就是问题的来源。修复是为了确保 System.Web.Http.SelfHost.dll
的 v5.2.3 在 bin 目录中,并添加到单元测试程序集的 app.config 的重定向。
我有这样一种情况,我在一个客户端应用程序中有一些代码在一个以 .net4.0 为目标的程序集中使用了 System.Web.Http.SelfHost.HttpSelfHostServer
,结果依赖于 [=14 的 v4.0.0.0 =]
我在服务器上还有一些其他代码,它是一个 webApi,目标是 .net4.6.1。此程序集依赖于 System.Web.Htpp.dll
v5.2.3
一切正常。
但后来我来写一个自动化集成测试(作为单元测试),其中过程需要实例化系统的两个部分(没有 IIS 之类的脚手架)。单元测试程序集必须是 .net4.6.1(因为它依赖于服务器端程序集)。这意味着单元测试程序集中对 System.Web.Http
的引用将 v5.2.3 带入其 bin 文件夹。
在运行时,这会导致 ReflectionTypeLoadException
和 LoaderException
"{"Inheritance security rules violated by type: 'System.Web.Http.SelfHost.HttpSelfHostConfiguration'. Derived types must either match the security accessibility of the base type or be less accessible.":"System.Web.Http.SelfHost.HttpSelfHostConfiguration"}"
在我的app.config(用于单元测试程序集)中我有一个运行时重定向:
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" />
</dependentAssembly>
这意味着我的 .net4 依赖项被迫使用 System.Web.Http 的 v5.2.3。
如果没有此运行时重定向,客户端程序集会抱怨缺少依赖项(System.Web.Http
v4.0.0.0),如果我在 bin 目录中有 System.Web.Http
的 v4.0.0.0 (但不是 v5.2.3)然后服务器端程序集抱怨缺少依赖项。
有什么办法可以解决这个问题吗?在我看来 System.Web.Http
v5.2.3 不向后兼容。
这比上面看起来简单多了。客户端代码是使用 System.Web.Http.SelfHost.HttpSelfHostServer
的代码,因此它将程序集 System.Web.Http.SelfHost.dll
拉入 bin 目录。
单元测试程序集正在引入 System.Web.Http.dll
,因为它和服务器端都需要它。
selfhost dll 是 v4.0.0.0,system.web.http 是 v5.2.3。这就是问题的来源。修复是为了确保 System.Web.Http.SelfHost.dll
的 v5.2.3 在 bin 目录中,并添加到单元测试程序集的 app.config 的重定向。