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

VB.NET(.NET Framework)Http请求转C# ASP.NET Core HttpClient疑问

VB.NET HttpWebRequest 转 ASP.NET Core HttpClient 实现

原VB.NET实现代码

Public Function PostRundown(data As String) As String
    Dim url = "https://url/import"

    Dim result As String = ""
    Dim httpRequest = CType(WebRequest.Create(url), HttpWebRequest)
    httpRequest.Method = "POST"
    httpRequest.ContentType = "application/x-www-form-urlencoded"

    'Dim authInfo = "xxx:xxx"
    Dim authInfo = config.NxtAuthInfo
    authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo))
    httpRequest.Headers("Authorization") = "Basic " & authInfo
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Tls11 Or SecurityProtocolType.Tls12 Or SecurityProtocolType.Ssl3
    ServicePointManager.ServerCertificateValidationCallback = AddressOf AcceptAllCertifications

    Using streamWriter = New StreamWriter(httpRequest.GetRequestStream())
        streamWriter.Write(data)
    End Using

    Dim httpResponse = CType(httpRequest.GetResponse(), HttpWebResponse)

    Using streamReader = New StreamReader(httpResponse.GetResponseStream())
        result = streamReader.ReadToEnd()
    End Using

    Return result
End Function

现有C#代码的问题分析

你当前的C#代码存在以下和原VB逻辑不一致或错误的地方:

  • Authorization头设置错误:AuthenticationHeaderValue的第一个参数是认证方案(应为"Basic"),第二个参数直接传入Base64编码后的凭证即可,不需要拼接"Basic "。
  • Content-Type头重复设置:DefaultRequestHeaders中添加ContentType是错误的,StringContent已经指定了内容类型,且该头属于内容头而非请求头,重复添加会导致请求异常。
  • 异步方法阻塞调用:使用content.ReadAsStringAsync().Result会阻塞线程,违背异步方法设计原则,应改用await。
  • 响应处理逻辑不一致:原VB代码会读取所有响应的内容,无论状态码是否为OK,而当前C#代码仅在OK时返回内容,否则返回空字符串。

修正后的C#实现

1. 配置HttpClientHandler(处理安全设置)

ASP.NET Core中通过HttpClientHandler替代原VB的ServicePointManager设置:

// 创建HttpClientHandler并配置安全相关规则
var handler = new HttpClientHandler
{
    // 指定支持的安全协议,对应原VB的SecurityProtocol配置
    SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Ssl3,
    // 自定义证书验证,对应原VB的AcceptAllCertifications逻辑
    ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true
};

// 初始化HttpClient(建议单例复用,避免Socket资源耗尽)
var _client = new HttpClient(handler);

2. 完整请求方法实现

public async Task<string> PostRundownAsync(string url, string data, string authInfo)
{
    // 处理Basic认证
    var base64Auth = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
    _client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64Auth);

    // 创建请求内容,保持编码和内容类型与原VB一致
    var content = new StringContent(data, Encoding.Default, "application/x-www-form-urlencoded");

    // 发送POST请求
    using var response = await _client.PostAsync(url, content);

    // 读取响应内容(和原VB逻辑一致,无论状态码都读取返回)
    return await response.Content.ReadAsStringAsync();
}

关键说明

  • HttpClient复用:ASP.NET Core中建议通过IServiceCollection.AddHttpClient()将HttpClient注册为单例服务复用,避免频繁创建实例导致的Socket资源问题。
  • 编码一致性:原VB使用Encoding.Default处理认证和请求内容,C#代码保持一致,避免编码差异导致的内容解析错误。
  • 证书验证风险:ServerCertificateCustomValidationCallback返回true会接受所有证书,仅建议在测试环境使用,生产环境需配置合法的证书验证逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:42:22