无法找到HttpRequestMessage,但引用了System.Net.Http

时间:2015-09-14 00:20:37

标签: c# .net visual-studio-2015

我有一个新的.Net 4.5.2(检查这是目标框架)Web API应用程序(在VS 2015中)。我引用了System.Net.Http,您可以看到版本是4.0.0.0:

properties of system.Net.Http reference

在我的过滤器/属性中,我试图引用位于HttpRequestMessage命名空间中的System.Net.Http(我在文件的顶部有正确的使用),但我收到消息

  

类型'HttpRequestMessage'在未引用的程序集中定义。您必须添加对程序集'System.Net.Http,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'

的引用

error when trying to reference HttpRequestMessage

虽然我不能引用该类,但我可以在Object Exploerer中浏览它(我假设它使用.dll旁边的同名.xml文件)。

我试过(编辑:以及通常重启VS和重建等):

  1. 删除并重新添加引用(来自Framework和 扩展 - 虽然我确定它的意思是框架版本,但我却变得绝望了)
  2. 从Nuget安装并引用我的版本 本地软件包文件夹,似乎只是默认返回系统范围版本。
  3. 使用:update-package -reinstall -ignoreDependencies
  4. 重新安装Nuget PM中的所有依赖项
  5. 手动将程序集添加到web.config手动将程序集添加到.csproj文件
  6. [编辑:解决方案:

    好的,我创建了一些新的VS Web API项目(和解决方案),看看我是否可以重现这个问题。最后,我创建了一个新的“Filters”文件夹,在那里创建了一个新的Filter类,复制了我的简化原文的内容,并且看到了HttpRequestMessage。同样的事情反过来(我的过滤器最初是在App_Code文件夹中创建的)它仍在工作。我想也许有一个看不见的引用旧的System.Net.Http正在投入扳手的工作,即使我可能已经注释掉了调用它的代码,不知何故它被记住了。这只是猜测。但无论如何,把它削减到最小的骨头并从那里开始是导致解决方案的最终方法。]

5 个答案:

答案 0 :(得分:1)

我还设法通过将自定义RouteConstraints移出App_Code文件夹来解决此问题。刚刚在我的项目中添加了一个新文件夹并将其复制到那里。

答案 1 :(得分:0)

如果您来自创建网站,但现在正在创建Web应用程序,请不要将App_Code文件夹或任何代码添加到其中,因为每个类文件都将设置为“内容”(单击该类,查看“构建操作”下的“属性”窗格),因此在应用程序的其余部分中不会被Intellisense选中,或者您可以设置为“编译”,但在发布时它有自己的问题所有关于它的时间:See Vishel Joshi's blog

答案 2 :(得分:0)

我尝试了这个强烈建议的解决方案(在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文件夹&gt; Add Reference... 展开窗口左侧的Assemblies,然后选择Framework。 滚动并选择程序集列表中的System.Net.Http。 确保选中System.Net.Http旁边的框,然后点击OK。 重建项目。

答案 3 :(得分:0)

我遇到了同样的问题(这是我偶然发现的一个问题),有一件事我注意到似乎还没有人锁定。

我正在构建WebApi2应用程序,并添加了一个类库以将其转换为nunit测试库。我开始与System.Web.Http发生冲突。看来webapi2使用5.2.6.0,其他情况下会尝试将其默认设置为4.0.0.0。

确保您使用的System.Web.Http版本正确,并且还引用了System.Net.Http程序集。一旦两个程序集都被引用并在所有解决方案中运行相同的版本号,便解决了所有问题。 VS并不总是自己加载正确的版本。

答案 4 :(得分:0)

在我的情况下,由于愿意在App_Code内部实际使用动态编译的文件,我不得不在Web.Config的编译节点中显式添加程序集:

<system.web>
  <compilation targetFramework="4.7.2">
    <assemblies>
      <add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
    </assemblies>
  </compilation>
  ...

这解决了我的情况。当然,可以根据您的项目需求调整目标框架。