VB.NET页面导入System.Net.Http失败报BC30002/BC40056错误
根因
这个报错和GAC是否安装System.Net.Http没有直接关系,核心原因是ASP.NET网站(Web Site模式,非预编译的Web Application项目)的编译阶段默认不会自动引用System.Net.Http程序集。
ASP.NET运行时在动态编译aspx页面时,只会默认加载一组预置的常用框架程序集作为编译引用:System.Net相关的基础类型都在System.dll里,属于默认引用范围,所以使用System.Net下的类不会报错;但HttpClient所在的System.Net.Http是独立的单独程序集,不在默认编译引用列表里,编译器解析Imports System.Net.Http语句时找不到对应程序集里的命名空间,就会触发BC40056警告,后续实例化HttpClient时直接抛出BC30002类型未定义错误。
之前在<runtime>节点下加的assemblyBinding配置只作用于运行时阶段的程序集加载/重定向逻辑,完全不影响编译阶段的引用解析,自然解决不了问题。
解决方法
不需要重新安装或修改GAC里的程序集,当前GAC中的System.Net.Http版本是正常的,选下面任意一种方式补全编译阶段的引用即可:
- 全站生效配置(推荐)
打开站点根目录的web.config,找到<system.web>下的<compilation>节点,在其<assemblies>子节点中添加System.Net.Http的引用配置,注意不要放到<runtime>节点下:
<system.web> <!-- targetFramework替换为你站点实际使用的.NET Framework版本,例如4.7.2、4.8 --> <compilation targetFramework="4.8"> <assemblies> <add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> </assemblies> </compilation> </system.web>
保存后重启对应站点的应用程序池即可生效。
- 单页面生效配置
如果只需要在单个页面使用HttpClient,可以直接在对应.aspx页面的顶部、@Page指令下方添加程序集引用指令,不需要修改全局配置:
<%@ Assembly Name="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" %>
注意事项
不要额外通过NuGet为基于.NET Framework的IIS站点安装独立的System.Net.Http包,很容易和系统GAC中自带的框架原生版本产生版本冲突,反而引发更多加载错误。
内容的提问来源于stack exchange,提问作者Massimo
相关产品推荐
相关产品推荐

