如何解决POST XML时触发的System.ArgumentException:无效CRLF字符错误?
解决方法
错误原因
HTTP请求头的字段值不允许包含CRLF(回车/换行)字符,你的XML数据里必然存在大量换行和回车,所以将XML直接赋值给请求头strShipmentDetailsXML时触发了参数异常。而且你代码中已经正确地将XML写入了请求体(streamWriter.Write(data)),完全不需要再把XML放到请求头里。
修复步骤
- 删除错误的请求头赋值代码:直接移除
httpRequest.Headers("strShipmentDetailsXML") = data这一行。 - 保留请求体写入逻辑:你已经通过
streamWriter.Write(data)将XML数据放到了POST请求的主体中,这才是传递XML数据的正确方式。
修改后的完整代码
Dim url = "https://gold.mxpress2u.net/gold/API.asmx" Dim httpRequest = CType(WebRequest.Create(url), HttpWebRequest) httpRequest.Method = "POST" httpRequest.ContentType = "application/xml" httpRequest.Accept = "application/xml" Dim data = Me.txtXML.Text httpRequest.Headers("strAPIKey") = "API Key" httpRequest.Headers("strCustomerAccount") = "Account No" httpRequest.Headers("intPrintFormatType") = "1" ' 移除了错误的strShipmentDetailsXML请求头赋值 Using streamWriter = New StreamWriter(httpRequest.GetRequestStream()) streamWriter.Write(data) End Using Dim httpResponse = CType(httpRequest.GetResponse(), HttpWebResponse) Using streamReader = New StreamReader(httpResponse.GetResponseStream()) Dim result = streamReader.ReadToEnd() ' 这里可以处理返回的result,比如输出或解析 End Using Console.WriteLine(httpResponse.StatusCode)
额外说明
如果API文档明确要求strShipmentDetailsXML必须通过请求头传递(这种情况非常罕见),你需要对XML数据进行编码处理,比如用Base64编码去掉所有CRLF:
' 仅当API要求Header传递XML时使用 Dim encodedData = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(data)) httpRequest.Headers("strShipmentDetailsXML") = encodedData
但这种情况下需要确认API端是否支持解码Base64格式的XML数据。
内容的提问来源于stack exchange,提问作者maideen
相关产品推荐
相关产品推荐

