Windows Server 2019 IIS环境.NET程序集引用报错问题咨询
问题核心原因
- 你最初遇到的CS1061编译错误和缺少System.Net.Http.Extensions/Formatting包没有任何关系,是异步代码写法错误导致的:
HttpClient.SendAsync()方法返回值是Task<HttpResponseMessage>类型,你没有使用await关键字等待异步任务执行完成,直接拿Task类型的对象访问IsSuccessStatusCode属性,自然会提示找不到该成员。你在后续读取响应内容的代码里写了await,但不仅前面的SendAsync漏了await,方法本身也没有标记async,本身就不符合异步方法的语法规则。 - 后续出现的程序集加载失败错误,是因为你通过PowerShell的
Install-Package安装的NuGet包存放在系统级的包管理目录下,IIS运行ASP.NET 4.x站点时,只会从站点根目录的bin文件夹、系统全局程序集缓存(GAC)两个位置加载dll,根本不会扫描你那个系统级NuGet包路径,所以哪怕web.config里写了程序集配置,也找不到对应的文件。另外Windows Server 2019自带的.NET Framework 4.7+已经内置了完整的System.Net.Http组件,完全不需要额外安装2.x版本的旧Microsoft.Net.Http包,强行安装反而会引入版本冲突。
分步修复方案
- 第一步:清理无效配置
打开web.config,删掉你添加的System.Net.Http.Extensions程序集引用行,不需要保留任何和这个第三方旧包相关的配置。修正后的compilation节点配置如下:<compilation> <assemblies> <add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/> </assemblies> </compilation> - 第二步:修正后端C#代码的异步写法
把default.aspx里的服务端代码改成如下正确形式,补全async标记和漏掉的await关键字:<script runat="server" language="C#"> static readonly HttpClient client = new HttpClient(); // 异步方法必须加async标记,页面事件回调可以用async void async void GetToken() { var request = new HttpRequestMessage(HttpMethod.Post, "替换为你的实际请求URL"); request.Content = new FormUrlEncodedContent(new Dictionary<string, string> { { "client_id", "替换为你的实际client_id" }, { "client_secret", "替换为你的实际client_secret" }, { "grant_type", "client_credentials" } }); // 必须加await等待请求完成,拿到HttpResponseMessage实例再操作 var response = await client.SendAsync(request); if(response.IsSuccessStatusCode) { // 注意:如果使用JObject需要在页面顶部加<%@ Import Namespace="Newtonsoft.Json.Linq" %>,同时把Newtonsoft.Json.dll放到站点bin目录 var payload = JObject.Parse(await response.Content.ReadAsStringAsync()); var token = payload.Value<string>("access_token"); Response.Write(token); } else { Response.Write($"请求失败,状态码:{response.StatusCode}"); } } </script> - 第三步:确认站点运行配置
打开IIS管理器找到对应站点的应用程序池,确认.NET CLR版本选择为v4.0,和web.config里配置的targetFramework版本匹配,不要选成v2.0或者无托管代码。 - (可选)如果确实需要使用System.Net.Http.Extensions里的扩展方法
不要通过PowerShell全局安装包,直接从你之前找到的NuGet包存储路径,把System.Net.Http.Extensions.dll以及它依赖的所有dll文件,全部复制到你站点根目录下的bin文件夹里,再在web.config里添加对应的程序集引用即可正常加载,缺任何一个依赖dll都会触发加载失败错误。
补充说明
- 你系统里找不到
dotnet命令是正常现象:你运行的是基于.NET Framework的ASP.NET Web Forms站点,dotnetCLI是给.NET Core/.NET 5+跨平台版本用的,.NET Framework本身不会默认注册这个命令到系统环境变量。 System.Net.Http.Formatting是旧版ASP.NET Web API 2的自带组件,现在已经停止更新,普通HTTP请求场景用内置的HttpClient完全可以满足需求,不需要额外引入这个包。- 你现在代码里用静态单例方式声明HttpClient的写法是正确的,不需要每次请求都新建HttpClient实例,避免套接字耗尽问题。
内容的提问来源于stack exchange,提问作者Fanis del
相关产品推荐
相关产品推荐

