找不到 HttpRequestMessage,但引用了 System.Net.Http
HttpRequestMessage could not be found, yet System.Net.Http is referenced
我有一个新的 .Net 4.5.2(已检查这是目标框架)Web API 应用程序(在 VS 2015 中)。我引用了 System.Net.Http
,如您所见,版本是 4.0.0.0:
在我的 Filter/Attribute 中,我试图引用 System.Net.Http
命名空间中的 HttpRequestMessage
(我在文件顶部有正确的使用),但我得到了留言
The type 'HttpRequestMessage' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
虽然我无法引用 class,但我可以在 Object Exploerer 中浏览到它(我假设这使用了 .dll 旁边的同名 .xml 文件).
我已经尝试过(编辑:以及通常的重启 VS 和重建等):
- 删除并重新添加引用(从框架和
扩展 - 虽然我确定它是框架版本,但我感到绝望)
- 从 Nuget 安装并引用我的版本
本地包文件夹,它似乎只是默认返回到系统范围的版本。
- 在 Nuget PM 中重新安装我的所有依赖项:
update-package -reinstall -ignoreDependencies
- 手动将程序集添加到 web.config 手动将程序集添加到 .csproj 文件
[编辑:解决方案:
好的,我创建了一些新的 VS Web API 项目(和解决方案)以查看是否可以重现该问题。最后我创建了一个新的 "Filters" 文件夹,在那里创建了一个新的 Filter
class,复制了我精简的原始文件的内容,然后瞧瞧 HttpRequestMessage
被认可。以另一种方式返回同样的事情(我的过滤器最初是在 App_Code 文件夹中创建的)并且它仍在工作。我想也许有一个看不见的对旧 System.Net.Http
的引用,它在工作中造成了麻烦,即使我可能已经注释掉了调用它的代码,但不知何故它被记住了。那只是一个猜测。但无论如何,将它精简到最基本的部分并从那里开始是导致解决方案的最终方法。]
我还设法通过将自定义 RouteConstraints 移出 App_Code 文件夹解决了这个问题。刚刚向我的项目添加了一个新文件夹并将它们复制到那里。
如果您以前创建网站,但现在正在创建 Web 应用程序,请不要将 App_Code
文件夹或任何代码添加到其中,因为每个 class 文件要么设置为 "Content"(单击 class,查看 "Build Action" 下的“属性”窗格),因此 Intellisense 不会在应用程序的其余部分获取,或者您可以设置到 "Compile" 但是在发布时它有自己的问题:See Vishel Joshi's blog 全部。
我已经尝试过这个高度推荐的解决方案(在 Web.Config 上)
<system.web>
<compilation debug="true" targetFramework="4.5" />
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</assemblies>
</compilation>
</system.web>
但不幸的是,这对我不起作用。最后,我找到了解决方案(这对我有用)
右键单击 References
文件夹 > Add Reference...
展开 window 和 select 框架左侧的程序集。
滚动到程序集列表中的 select System.Net.Http
。
确保选中 System.Net.Http
旁边的框,然后单击 OK
。
重建项目。
我遇到了同样的问题(这就是我偶然发现这个问题的原因)并且我注意到一件事似乎还没有人理解。
我正在构建一个 WebApi2 应用程序,我添加了一个 class 库以变成一个 nunit 测试库。我开始与 System.Web.Http 发生冲突。看来webapi2使用的是5.2.6.0,其他东西会尝试默认为4.0.0.0.
确保您使用的 System.Web.Http 版本正确,并且您还引用了 System.Net.Http 程序集。一旦两个程序集都被引用并且 运行 所有解决方案中的相同版本号,所有问题都得到解决。 VS 并不总是自己加载正确的版本。
在我的例子中,想要在 App_Code
中实际使用动态编译的文件,我不得不在 Web.Config 的编译节点中显式添加程序集:
<system.web>
<compilation targetFramework="4.8">
<assemblies>
<add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</assemblies>
</compilation>
...
这解决了我的问题。当然,根据自己的项目需要调整目标框架。
我有一个新的 .Net 4.5.2(已检查这是目标框架)Web API 应用程序(在 VS 2015 中)。我引用了 System.Net.Http
,如您所见,版本是 4.0.0.0:
在我的 Filter/Attribute 中,我试图引用 System.Net.Http
命名空间中的 HttpRequestMessage
(我在文件顶部有正确的使用),但我得到了留言
The type 'HttpRequestMessage' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'
虽然我无法引用 class,但我可以在 Object Exploerer 中浏览到它(我假设这使用了 .dll 旁边的同名 .xml 文件).
我已经尝试过(编辑:以及通常的重启 VS 和重建等):
- 删除并重新添加引用(从框架和 扩展 - 虽然我确定它是框架版本,但我感到绝望)
- 从 Nuget 安装并引用我的版本 本地包文件夹,它似乎只是默认返回到系统范围的版本。
- 在 Nuget PM 中重新安装我的所有依赖项:
update-package -reinstall -ignoreDependencies
- 手动将程序集添加到 web.config 手动将程序集添加到 .csproj 文件
[编辑:解决方案:
好的,我创建了一些新的 VS Web API 项目(和解决方案)以查看是否可以重现该问题。最后我创建了一个新的 "Filters" 文件夹,在那里创建了一个新的 Filter
class,复制了我精简的原始文件的内容,然后瞧瞧 HttpRequestMessage
被认可。以另一种方式返回同样的事情(我的过滤器最初是在 App_Code 文件夹中创建的)并且它仍在工作。我想也许有一个看不见的对旧 System.Net.Http
的引用,它在工作中造成了麻烦,即使我可能已经注释掉了调用它的代码,但不知何故它被记住了。那只是一个猜测。但无论如何,将它精简到最基本的部分并从那里开始是导致解决方案的最终方法。]
我还设法通过将自定义 RouteConstraints 移出 App_Code 文件夹解决了这个问题。刚刚向我的项目添加了一个新文件夹并将它们复制到那里。
如果您以前创建网站,但现在正在创建 Web 应用程序,请不要将 App_Code
文件夹或任何代码添加到其中,因为每个 class 文件要么设置为 "Content"(单击 class,查看 "Build Action" 下的“属性”窗格),因此 Intellisense 不会在应用程序的其余部分获取,或者您可以设置到 "Compile" 但是在发布时它有自己的问题:See Vishel Joshi's blog 全部。
我已经尝试过这个高度推荐的解决方案(在 Web.Config 上)
<system.web>
<compilation debug="true" targetFramework="4.5" />
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add assembly="System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</assemblies>
</compilation>
</system.web>
但不幸的是,这对我不起作用。最后,我找到了解决方案(这对我有用)
右键单击 References
文件夹 > Add Reference...
展开 window 和 select 框架左侧的程序集。
滚动到程序集列表中的 select System.Net.Http
。
确保选中 System.Net.Http
旁边的框,然后单击 OK
。
重建项目。
我遇到了同样的问题(这就是我偶然发现这个问题的原因)并且我注意到一件事似乎还没有人理解。
我正在构建一个 WebApi2 应用程序,我添加了一个 class 库以变成一个 nunit 测试库。我开始与 System.Web.Http 发生冲突。看来webapi2使用的是5.2.6.0,其他东西会尝试默认为4.0.0.0.
确保您使用的 System.Web.Http 版本正确,并且您还引用了 System.Net.Http 程序集。一旦两个程序集都被引用并且 运行 所有解决方案中的相同版本号,所有问题都得到解决。 VS 并不总是自己加载正确的版本。
在我的例子中,想要在 App_Code
中实际使用动态编译的文件,我不得不在 Web.Config 的编译节点中显式添加程序集:
<system.web>
<compilation targetFramework="4.8">
<assemblies>
<add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</assemblies>
</compilation>
...
这解决了我的问题。当然,根据自己的项目需要调整目标框架。