我尝试将JSON请求发送到HTTPS安全的REST服务。客户端解释说REST服务正在使用自签名证书。他还解释说这是一项开发服务,我应该忽略任何证书警告。 (该服务在我们办公室的RaspberryPi上运行)
他向我转发了以下CURL请求,以证明它正在运作:
curl -k -H "Content-Type: application/json" -X POST -d '{"MerchantReference":"[removed]",
"Command":"Debit", "Amount":5500,"DeviceSerialNumber":"[removed]"}' https://[removed]
当我与Putty建立联系并运行时,我会收到回复,所以一切都很好。但是当我用C#编写应用程序来执行此操作时,我得到以下异常: "基础连接已关闭:发送时发生意外错误。"内部异常是:"身份验证失败,因为远程方已关闭传输流。"
这是我的C#代码:
var tempRequest = @"{""MerchantReference"":""[removed]"",""Command"":""Debit"",
""Amount"":5500,""DeviceSerialNumber"":""[removed]""}";
HttpWebRequest webRequest = WebRequest.Create(HttpAddress) as HttpWebRequest;
webRequest.Method = WebRequestMethods.Http.Post;
webRequest.ContentType = "application/json";
byte[] buffer = Encoding.UTF8.GetBytes(tempRequest);
Stream postData = webRequest.GetRequestStream();
postData.Write(buffer, 0, buffer.Length);
postData.Close();
var webResponse = webRequest.GetResponse(); // The exception occurred here
我在应用程序启动时添加了对ServicePointManager.ServerCertificateValidationCallback的回调,只接受任何证书,但执行甚至无法到达该部分。
所以我的问题是如何在C#中复制CURL结果。
非常感谢任何协助。
答案 0 :(得分:0)
我发现了问题。使用TLS v1.2,我们使用的是.Net 4.0,它只支持TLS V1.0。我们要么升级到.Net 4.5,要么使用不同版本的TLS。