Webrequest通过HTTP工作但不通过HTTPS(SSL)工作

时间:2014-01-08 19:13:00

标签: c# rest ssl webrequest

我们有一个休息服务,可以在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工作吗?

由于

1 个答案:

答案 0 :(得分:0)

我发现了问题的原因。休息服务是在谈论SSL3而不是TLS。添加以下代码:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

问题解决了。