找不到 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 和重建等):

  1. 删除并重新添加引用(从框架和 扩展 - 虽然我确定它是框架版本,但我感到绝望)
  2. 从 Nuget 安装并引用我的版本 本地包文件夹,它似乎只是默认返回到系统范围的版本。
  3. 在 Nuget PM 中重新安装我的所有依赖项:update-package -reinstall -ignoreDependencies
  4. 手动将程序集添加到 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>
  ...

这解决了我的问题。当然,根据自己的项目需要调整目标框架。