如何在C#中使用HTTP GET请求并带有SSL?(协议违规)

9

我目前正在尝试在C#中从使用SSL的服务器获取响应。我有Java代码可以做到这一点,但看起来它们并不能逐字翻译。

我找到了一些可用于常规页面的代码,但对于我需要的那个页面不起作用(也许是因为SSL的原因)。以下是代码:

        WebRequest request = WebRequest.Create("https://" + sslServerHost + ":" + sslServerPort);
    request.Proxy = null;
    request.Credentials = CredentialCache.DefaultCredentials;

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream dataStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);
    string responseFromServer = reader.ReadToEnd();

更新:很抱歉,我似乎忘记了错误是什么。 我在“HttpWebResponse response = (HttpWebResponse)request.GetResponse();��这一行处收到协议违规异常。 有什么想法吗?谢谢大家。


请描述出现了什么问题?它只是没有返回结果吗?你是否收到了某种异常?如果是这样,是什么类型的异常,以及消息是什么? - JMarsch
1
可能是不受信任的证书问题? - Dscoduc
3个回答

14

通过SSL进行的HTTP对话需要使用正确颁发的证书进行验证。

您可以使用RemoteCertificateValidationCallback委托来验证SSL证书,如下所示:

public static void ConnectSSL()
{

    WebRequest request = WebRequest.Create("https://" + sslServerHost + ":" + sslServerPort);
    request.Proxy = null;
    request.Credentials = CredentialCache.DefaultCredentials;

   //allows for validation of SSL certificates 

    ServicePointManager.ServerCertificateValidationCallback += new  System.Net.Security.RemoteCertificateValidationCallback(ValidateServerCertificate);

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    Stream dataStream = response.GetResponseStream();
    StreamReader reader = new StreamReader(dataStream);
    string responseFromServer = reader.ReadToEnd();

}

//for testing purpose only, accept any dodgy certificate... 
public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
          return true; 
}

请确保正确处理HttpWebResponse对象,或者至少在finally块中调用Close()方法以释放资源! - Mike Atlas

2
只是一个想法,你试过在末尾加上“/”吗?另外,你可能会觉得这种方法更容易:
string s;
using(WebClient client = new WebClient()) {
    client.UseDefaultCredentials = true;
    s = client.DownloadString("https://" + sslServerHost + ":"
       + sslServerPort + "/");
}

谢谢你的建议,但是不行。 - Amber

1

这里是一些测试代码,我已经成功地用它来测试SSL连接...

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.dscoduc.com");
//request.Method = "HEAD";
//request.AllowAutoRedirect = false;
request.Credentials = CredentialCache.DefaultCredentials;

// Ignore Certificate validation failures (aka untrusted certificate + certificate chains)
ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); 

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Stream resStream = response.GetResponseStream();
StreamReader reader = new StreamReader(resStream);
string responseFromServer = reader.ReadToEnd();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接