Hi,
I need help with ssl handshakes.
I appreciate any help you can provide :)
Tested Framework(s): .NET 4.5 (will be used), .NET 4.0 (same behavior)
Situation:
- The following code is producing the following output
- On each request, a ssl handshake will be done
- I checked this with ServerCertificateValidationCallback
- and also with WireShark (Client Hello, Server Hello)
- For testing purpose, the part HandleResponse(request); was used several times. The end product will not get a response, because I dont really need it! So the method HandleResponse(request); wont be called
- I noticed, whenever an WebException in HandleResponse(request); occurs, the next request will do a ssl handshake. The problem is, its pretty often
- Main reason for WebException is the HTTP 502 StatusCode
- The request will be done every couple of minutes up to every couple of hours
- My goal is to minimize the ssl handshake data traffic and latency
Console Output:
Certificate WebExceptionStatus.ProtocolError Certificate WebExceptionStatus.ProtocolError Certificate WebExceptionStatus.ProtocolError
Representing Code, if you need more information, just ask:
public static bool AcceptAllCertifications(object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
Console.WriteLine("Certificate");
return true;
}
public void Run()
{
ServicePointManager.ServerCertificateValidationCallback = AcceptAllCertifications;
while (true)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://####.##/path");
request.Method = "POST";
request.KeepAlive = true;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.Proxy = null;
string content = "...";
byte[] byteArray = Encoding.UTF8.GetBytes(content);
request.ContentLength = byteArray.Length;
using (Stream stream = request.GetRequestStream())
{
stream.Write(byteArray, 0, byteArray.Length);
}
HandleResponse(request);
Thread.Sleep(3000);
}
}
public void HandleResponse(HttpWebRequest request)
{
try
{
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//...
}
catch (WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError)
{
using (StreamReader sr = new StreamReader(e.Response.GetResponseStream()))
{
string content = sr.ReadToEnd();
}
}
}
}