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

.NET 4.0应用调用服务器端.NET Core 2.1 Web API时HttpWebRequest请求超时无响应问题求助

.NET 4.0应用调用IIS部署的.NET Core Web API超时问题排查

问题背景

我们有一个部署在IIS上的.NET Core 2.1 Web API,本地localhost运行时,.NET 4.0客户端应用能正常调用获取数据;但将API部署到服务器、修改客户端请求URL后,调用出现超时:HTTPS请求卡在request.GetRequestStream(),HTTP请求卡在request.GetResponse()。Postman发起POST请求完全正常,服务器已启用TLS 1.0/1.1/1.2,客户端与服务器同属一个网络,调整代理设置后问题依旧。

客户端核心代码如下:

var resultDt = new DataTable();
var url = "https://myServer:5100/api/Service/Execute";
var request = (HttpWebRequest)WebRequest.Create(url);
request.Credentials = CredentialCache.DefaultCredentials;
request.UseDefaultCredentials = true;
request.ContentType = "application/json";
request.Method = "POST";
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | (SecurityProtocolType)3072;
try
{
    using (var streamWriter = new StreamWriter(request.GetRequestStream()))
    {
        string json = string.Format("{{\"CommandText\":\"{0}\"}}", query);
        streamWriter.Write(json);
    }
    using(var response = (HttpWebResponse)request.GetResponse())
    {
        using (var reader = new StreamReader(response.GetResponseStream()))
        {
            var result = reader.ReadToEnd();
            if (!string.IsNullOrEmpty(result))
            {
                var rows = JArray.Parse(result);
                foreach (var row in rows.Children())
                {
                    var columns = row.Children<JProperty>();
                    if (resultDt.Columns.Count == 0)
                    {
                        foreach (var column in columns)
                        {
                            resultDt.Columns.Add(new DataColumn() {{ ColumnName = column.Name, DataType = typeof(string) }});
                        }
                    }
                    var newRow = resultDt.NewRow();
                    foreach (var column in columns)
                    {
                        newRow[column.Name] = column.Value;
                    }
                    resultDt.Rows.Add(newRow);
                }
            }
        }
    }
}
catch (Exception ex)
{
    Logger.Instance().Fatal(ex.Message, ex);
}
return resultDt;

排查与解决方案

1. 修正TLS协议设置的顺序(最可能的原因)

你的代码中先创建了WebRequest,再设置ServicePointManager.SecurityProtocol,这会导致TLS设置不生效!因为.NET会在第一次请求目标URL时创建ServicePoint,后续修改SecurityProtocol对已创建的ServicePoint无效。

修改代码:把ServicePointManager的设置移到创建WebRequest之前:

var resultDt = new DataTable();
var url = "https://myServer:5100/api/Service/Execute";
// 先设置TLS协议,建议移除不安全的Ssl3
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
// 再创建请求
var request = (HttpWebRequest)WebRequest.Create(url);
// 后续代码不变...

2. 处理SSL证书信任问题(HTTPS场景)

如果服务器用的是自签名证书或内部CA颁发的证书,.NET 4.0默认会拒绝信任这类证书,导致请求卡住(Postman会提示并允许用户手动信任,所以能正常访问)。

临时测试方案:添加证书验证回调跳过验证(生产环境请务必通过导入证书到信任库解决):

// 在创建请求前添加
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

3. 禁用自动代理检测

即使客户端和服务器在同一网络,.NET 4.0的WebRequest可能会自动读取系统代理设置,导致请求错误地走了代理。可以显式禁用代理:

request.Proxy = null;
// 或者设置为默认代理但绕过本地地址
// request.Proxy = new WebProxy { BypassProxyOnLocal = true };

4. 验证服务器端口与防火墙

虽然Postman能访问,但要确认客户端所在机器能通服务器的5100端口:

  • 用telnet myServer 5100测试端口连通性
  • 检查服务器防火墙是否开放了5100端口(包括入站规则)
  • 确认IIS站点的绑定是否正确(HTTP/HTTPS的端口、证书配置)

5. 排查身份验证配置

你的代码启用了UseDefaultCredentials,如果服务器API启用了Windows身份验证,需要确认:

  • 客户端应用运行的账号有访问服务器API的权限
  • IIS站点的Windows身份验证已启用,匿名身份验证是否关闭(如果API需要身份验证)
  • 可以尝试临时开启API的匿名身份验证,测试是否能正常调用,排除身份验证问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 10:44:10