You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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站点,dotnet CLI是给.NET Core/.NET 5+跨平台版本用的,.NET Framework本身不会默认注册这个命令到系统环境变量。
  • System.Net.Http.Formatting是旧版ASP.NET Web API 2的自带组件,现在已经停止更新,普通HTTP请求场景用内置的HttpClient完全可以满足需求,不需要额外引入这个包。
  • 你现在代码里用静态单例方式声明HttpClient的写法是正确的,不需要每次请求都新建HttpClient实例,避免套接字耗尽问题。

内容的提问来源于stack exchange,提问作者Fanis del

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:48:04