我们有一个休息服务,可以在http上正常工作。我使用以下C#代码向其发布数据:
string postData = [contains the data to post]
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
var baseAddress = "http://www.myserver.net/rest/saveData";
System.Net.WebRequest req = System.Net.WebRequest.Create(baseAddress);
string authInfo = "username:password";
authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
req.Headers["Authorization"] = "Basic " + authInfo;
req.ContentType = "application/x-www-form-urlencoded";
req.Method = "POST";
byte[] bytes = System.Text.Encoding.ASCII.GetBytes(postData);
req.ContentLength = bytes.Length;
System.IO.Stream os = req.GetRequestStream();
os.Write(bytes, 0, bytes.Length); //Push it out there
os.Close();
System.Net.WebResponse resp = req.GetResponse();
var s = resp.GetResponseStream();
var sr = new System.IO.StreamReader(s);
var r= sr.ReadToEnd().Trim();
现在,如果将此更改为SSL,请使用https呼叫替换http呼叫:
"https://www.myserver.net/rest/saveData";
这不起作用,因为它在GetReponse调用时超时。首先,我认为是由自签名证书引起的,但事实并非如此:
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
接受所有证书。我得到的错误就像在传输层上返回的零字节(它是我的语言,所以我不确切知道英语异常是什么)
我在命令行上使用CURL来测试调用,并且它在http和SSL上都有效,所以其余服务似乎没问题。
有人知道为什么它不能通过SSL工作吗?
由于
答案 0 :(得分:0)
我发现了问题的原因。休息服务是在谈论SSL3而不是TLS。添加以下代码:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
问题解决了。