将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实现方案
核心要点
- Cookie自动管理:用
HttpClientHandler.CookieContainer替代Curl的--cookie-jar,自动维护会话Cookie - 请求格式匹配:Curl的
-F参数对应multipart/form-data格式,而非原代码使用的application/x-www-form-urlencoded,这是原代码失效的关键原因 - 协议兼容处理:配置
UseUnsafeHeaderParsing和KeepAlive=False,适配服务器的非标准协议实现 - 高效请求优化:使用
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
相关产品推荐
相关产品推荐

