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

8

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

properties of system.Net.Http reference

在我的筛选器/属性中,我试图引用位于System.Net.Http命名空间中的HttpRequestMessage(我在文件顶部有正确的using),但是却收到了以下消息:“类型“HttpRequestMessage”在未被引用的程序集中定义。您必须添加对程序集“System.Net.Http,版本=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”的引用。”

error when trying to reference HttpRequestMessage

虽然我无法引用那个类,但我可以在对象资源管理器中浏览到它(我假设这使用了与.dll文件旁边同名的.xml文件)。

我已经尝试过以下方法(编辑:以及通常的重新启动VS和重建等):

  1. 删除并重新添加引用(从框架和扩展中 - 尽管我确定它应该是框架版本,但我变得绝望了)
  2. 从Nuget安装并引用我的本地包文件夹中的版本,似乎只是默认回到系统范围内的版本。
  3. 使用以下命令在Nuget PM中重新安装所有依赖项:update-package -reinstall -ignoreDependencies
  4. 将程序集手动添加到web.config,将程序集手动添加到.csproj文件中

[编辑:解决方案:

]

好的,我创建了几个新的VS Web API项目(和解决方案)来看看是否能够重现问题。最后,我创建了一个新的“Filters”文件夹,在其中创建了一个新的Filter类,复制了我的简化原始内容,并且HttpRequestMessage被识别了。反过来做了同样的事情(我的过滤器最初是在App_Code文件夹中创建的),它仍然有效。我认为可能有一个看不见的引用旧的System.Net.Http,导致出现问题,即使我可能已经注释掉了调用它的代码,但某种方式它仍然被记住。这只是一个猜测。但无论如何,将其削减到最简单的形式,然后从那里开始是导致解决方案的最终方法。


2
可能是VS出了问题?尝试重新启动你的IDE。 - James Parsons
1
您可能还需要在web.config/app.config中为system.net.http提供绑定重定向。您能确认它是否存在吗? - KnightFox
1
尝试将其设置为复制本地,然后恢复包。如果没有帮助,请将特定版本设置为true。 - ivamax9
@James_Parsons 是的,我试过了(抱歉,应该加到列表中 :) ) - monty
@KnightFox,在 web.config 文件中我已经尝试过以下代码:<dependentAssembly> <assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" /> <bindingRedirect oldVersion="1.0.0.0-4.0.0.0" newVersion="4.0.0.0" /> </dependentAssembly> - monty
显示剩余6条评论
5个回答

2

在我的情况下,我希望真正使用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>
  ...

这解决了我的问题。当然,根据您的项目需求调整目标框架。"Original Answer"翻译成"最初的回答"。

1

我也成功解决了这个问题,方法是将我的自定义RouteConstraints移出App_Code文件夹,只需在项目中添加一个新文件夹并将它们复制到那里即可。


是的,我后来阅读了这篇文章(http://vishaljoshi.blogspot.co.uk/2009/07/appcode-folder-doesnt-work-with-web.html),发现将任何东西放在App_Code文件夹中对于任何内容(包括Web应用程序)都是一个问题,但对于网站则不是。 - monty

1

我尝试了这个备受推荐的解决方案(在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... 在窗口左侧扩展程序集并选择 Framework。 在程序集列表中滚动并选择 System.Net.Http。 确保旁边的框已选中 System.Net.Http,然后单击 OK。 重新构建项目。


0

我遇到了同样的问题(这也是我偶然发现这个问题的原因),但有一件事情我注意到似乎没有人关注过。

我正在构建一个WebApi2应用程序,并添加了一个类库以将其转换为nunit测试库。我开始遇到System.Web.Http的冲突。看起来webapi2使用5.2.6.0,而其他东西会尝试默认使用4.0.0.0。

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


0

如果您曾经创建过网站,现在正在创建 Web 应用程序,请不要添加 App_Code 文件夹或其中的任何代码,因为每个类文件都将设置为 "Content"(单击类,在 "生成操作" 下查看属性窗格),因此不会被 Intellisense 在应用程序的其余部分中捕获,或者您可以设置为 "Compile" 但这在发布时有它自己的问题:请参阅 Vishel Joshi 的博客 其中有关它的所有内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接