C# System.Web.Http中的向后兼容性中断

C# System.Web.Http中的向后兼容性中断,c#,.net,.net-assembly,C#,.net,.net Assembly,我遇到过这样一种情况:我在客户端应用程序中有一些代码,它在以.net4.0为目标的程序集中使用了System.Web.Http.SelfHost.HttpSelfHostServer,因此依赖于System.Web.Http.dllv4.0.0 我在一个webApi服务器上还有一些其他代码,目标是.net4.6.1。此程序集依赖于System.Web.Htpp.dllv5.2.3 一切正常 但是接下来我要编写一个自动化集成测试(作为一个单元测试),其中流程需要实例化系统的两个部分(没有IIS之类

我遇到过这样一种情况:我在客户端应用程序中有一些代码,它在以.net4.0为目标的程序集中使用了
System.Web.Http.SelfHost.HttpSelfHostServer
,因此依赖于
System.Web.Http.dll
v4.0.0

我在一个webApi服务器上还有一些其他代码,目标是.net4.6.1。此程序集依赖于
System.Web.Htpp.dll
v5.2.3

一切正常

但是接下来我要编写一个自动化集成测试(作为一个单元测试),其中流程需要实例化系统的两个部分(没有IIS之类的脚手架)。单元测试程序集必须是.net4.6.1(因为它依赖于服务器端程序集)。这意味着单元测试程序集中对
System.Web.Http
的引用将v5.2.3带到其bin文件夹中

在运行时,这将导致带有
LoaderException的
ReflectionTypeLoadException

"{"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>


这比上面看到的要简单得多。客户端代码是使用
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添加重定向。

这比上面看到的要简单得多。客户端代码是使用
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添加重定向。

为什么不分离单元测试项目?只有一个单元测试项目。单元(集成测试)实例化客户机和服务器,然后继续调用其中一个或另一个的一些功能,并断言一切都按预期进行。服务器和客户机的代码(生产代码)位于两个独立的程序集中,单元测试位于引用这两个程序集的第三个程序集中。抱歉,如果不清楚,为什么不在自己的进程中实例化服务器?即使您确实设法解决了这个问题,您的集成测试也不再能够代表实际发生的情况,因为真正的服务器和真正的客户机使用不同的代码。代表性可能是集成测试中最重要的部分。显然,如果您的服务器在其自己的进程中运行,那么进行输入/输出测试会涉及更多的内容,因为您无法直接窥视它的大脑,但是,这应该是一个集成测试。是的,集成测试可能是一个错误的术语。我试图实现的更多的是端到端的扩展单元测试。我模拟了数据库连接,我验证了对数据库的调用,我模拟了在服务之间进行调用、拦截任何调用并使用测试设置路由它们的HttpClient,我验证了在已知输入的情况下,最后的结果是否如预期的那样。换言之,我需要直接查看流程的所有阶段,为什么不将单元测试项目分开?只有一个单元测试项目。单元(集成测试)实例化客户机和服务器,然后继续调用其中一个或另一个的一些功能,并断言一切都按预期进行。服务器和客户机的代码(生产代码)位于两个独立的程序集中,单元测试位于引用这两个程序集的第三个程序集中。抱歉,如果不清楚,为什么不在自己的进程中实例化服务器?即使您确实设法解决了这个问题,您的集成测试也不再能够代表实际发生的情况,因为真正的服务器和真正的客户机使用不同的代码。代表性可能是集成测试中最重要的部分。显然,如果您的服务器在其自己的进程中运行,那么进行输入/输出测试会涉及更多的内容,因为您无法直接窥视它的大脑,但是,这应该是一个集成测试。是的,集成测试可能是一个错误的术语。我试图实现的更多的是端到端的扩展单元测试。我模拟了数据库连接,我验证了对数据库的调用,我模拟了在服务之间进行调用、拦截任何调用并使用测试设置路由它们的HttpClient,我验证了在已知输入的情况下,最后的结果是否如预期的那样。换句话说,我需要直接窥视整个过程的各个阶段