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

将Curl POST命令转换为VB.Net HttpClient代码的问题求助

问题:将Curl POST请求转换为VB.Net HttpClient实现

原Curl请求代码

writer.WriteLine("curl.exe -s -X POST --cookie-jar C:\curl.cookies -F ""username=user"" -F ""pwd=pass"" http://192.168.2.170/goform/UserLogin")

writer.WriteLine("curl.exe -s --cookie C:\curl.cookies --cookie-jar C:\curl.cookies -F 'secondi=1' -F 'decimi=0' -F 'outputNumber=1' http://192.168.2.170/goform/con_SetOutput")

自行实现的HttpWebRequest代码(未达预期)

Public Sub FaiChiamataAPI()
        Dim url As String = "http://192.168.2.170/goform/UserLogin"
        Dim postData As String = "username=user&pwd=pass"

        Dim request As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
        request.Method = "POST"
        request.ContentType = "application/x-www-form-urlencoded"
        request.KeepAlive = False

        Using streamWriter As New StreamWriter(request.GetRequestStream())
            streamWriter.Write(postData)
        End Using

        Dim response As HttpWebResponse = DirectCast(request.GetResponse(), HttpWebResponse)

        Using streamReader As New StreamReader(response.GetResponseStream())
            Dim result As String = streamReader.ReadToEnd()
            ' Gestisci la risposta qui
        End Using

        ' Chiamata POST successiva
        Dim outputUrl As String = "http://192.168.2.170/goform/con_SetOutput"
        Dim outputData As String = "secondi=1&decimi=0&outputNumber=1"

        Dim outputRequest As HttpWebRequest = DirectCast(WebRequest.Create(outputUrl), HttpWebRequest)
        outputRequest.Method = "POST"
        outputRequest.ContentType = "application/x-www-form-urlencoded"

        Using outputStreamWriter As New StreamWriter(outputRequest.GetRequestStream())
            outputStreamWriter.Write(outputData)
        End Using

        Dim outputResponse As HttpWebResponse = DirectCast(outputRequest.GetResponse(), HttpWebResponse)

        Using outputStreamReader As New StreamReader(outputResponse.GetResponseStream())
            Dim outputResult As String = outputStreamReader.ReadToEnd()
            ' Gestisci la risposta qui
        End Using

        Console.WriteLine("Chiamate POST completate.")
    End Sub

遇到的问题

  • 必须设置request.KeepAlive = False,并在web.config中添加<system.net><httpWebRequest useUnsafeHeaderParsing="true"/></system.net>,否则会抛出System.Net.WebException: The server committed a protocol violation错误
  • 通过Curl获取的服务器响应如下:
HTTP/1.0 200 OK
Server: GoAhead-Webs
Pragma: no-cache
Cache-control: no-cache, no-store, must-revalidate
Expires: 0
Content-Type: text/html
Set-Cookie:User=webterm~; path=/
Set-Cookie:SessionId=73865833933~; path=/
Set-Cookie:group=USERS; path=/

<HEAD><META HTTP-EQUIV=refresh content=0;URL=../IT/></HEAD></html>
  • 无需处理服务器响应,仅需触发其内部功能

正确的VB.Net HttpClient实现方案

核心要点

  1. Cookie自动管理:用HttpClientHandler.CookieContainer替代Curl的--cookie-jar,自动维护会话Cookie
  2. 请求格式匹配:Curl的-F参数对应multipart/form-data格式,而非原代码使用的application/x-www-form-urlencoded,这是原代码失效的关键原因
  3. 协议兼容处理:配置UseUnsafeHeaderParsing和KeepAlive=False,适配服务器的非标准协议实现
  4. 高效请求优化:使用HttpCompletionOption.ResponseHeadersRead跳过响应体读取,符合仅触发功能的需求

实现代码

Imports System.Net.Http
Imports System.Net.Http.Headers
Imports System.Net

Public Async Sub FaiChiamataAPI()
    ' 配置HttpClientHandler,处理Cookie和协议兼容
    Dim handler As New HttpClientHandler() With {
        .CookieContainer = New CookieContainer(),
        .UseUnsafeHeaderParsing = True,
        .KeepAlive = False
    }

    ' 创建HttpClient,复用handler维持会话
    Using httpClient As New HttpClient(handler)
        ' 登录请求:构造multipart/form-data表单
        Dim loginContent As New MultipartFormDataContent()
        loginContent.Add(New StringContent("user"), "username")
        loginContent.Add(New StringContent("pass"), "pwd")

        ' 发送请求,仅读取响应头(无需处理响应体)
        Await httpClient.PostAsync("http://192.168.2.170/goform/UserLogin", loginContent).ConfigureAwait(False)

        ' 输出设置请求:构造对应表单
        Dim outputContent As New MultipartFormDataContent()
        outputContent.Add(New StringContent("1"), "secondi")
        outputContent.Add(New StringContent("0"), "decimi")
        outputContent.Add(New StringContent("1"), "outputNumber")

        Await httpClient.PostAsync("http://192.168.2.170/goform/con_SetOutput", outputContent).ConfigureAwait(False)
    End Using

    Console.WriteLine("Chiamate POST completate.")
End Sub

可选配置(web.config)

若需通过配置文件统一设置UseUnsafeHeaderParsing,可添加以下节点:

<configuration>
  <system.net>
    <httpWebRequest useUnsafeHeaderParsing="true" />
  </system.net>
</configuration>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 17:09:59