У меня есть приложение, пишущее C# (. Net 4.7.2) для отправки строки xml в https API с сертификатом клиента. Это мой код:
try {
ServicePointManager.Expect100Continue = true;
ServicePointManager.DefaultConnectionLimit = 9999;
ServicePointManager.SecurityProtocol = SecurityProtocolType.SystemDefault;
ServicePointManager.ServerCertificateValidationCallback = delegate(Object obj, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) {
return true;
};
HttpWebRequest request = null;
try {
request = (HttpWebRequest) WebRequest.Create(textBox1.Text);
result = "200";
} catch (Exception ex) {}
if (result.Equals("200")) {
ASCIIEncoding encoding = new ASCIIEncoding();
byte[] data = encoding.GetBytes(richTextBox1.Text);
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.Timeout = 10000;
request.ReadWriteTimeout = 10000;
request.ProtocolVersion = HttpVersion.Version11;
X509Certificate2 certificatex = GetX509Certificate(textBox2.Text.Trim(), textBox3.Text.Trim());
request.ClientCertificates.Add(certificatex);
request.PreAuthenticate = true;
request.ContentLength = data.Length;
try {
using(var streamWriter = new BufferedStream(request.GetRequestStream())) {
streamWriter.Write(data, 0, data.Length);
streamWriter.Flush();
streamWriter.Close();
}
} catch (ProtocolViolationException ex) {
richTextBox3.Text += "ProtocolViolationException : " + ex.Message + ex.StackTrace + "\n";
if (ex.InnerException != null) {
richTextBox3.Text += "ProtocolViolationException.InnerException : " + ex.InnerException.Message + ex.InnerException.StackTrace + "\n";
}
} catch (InvalidOperationException ex) {
richTextBox3.Text += "InvalidOperationException : " + ex.Message + ex.StackTrace + "\n";
if (ex.InnerException != null) {
richTextBox3.Text += "InvalidOperationException.InnerException : " + ex.InnerException.Message + ex.InnerException.StackTrace + "\n";
}
} catch (NotSupportedException ex) {
richTextBox3.Text += "NotSupportedException : " + ex.Message + ex.StackTrace + "\n";
if (ex.InnerException != null) {
richTextBox3.Text += "NotSupportedException.InnerException : " + ex.InnerException.Message + ex.InnerException.StackTrace + "\n";
}
}
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
richTextBox2.Text += response.StatusCode.ToString();
}
} catch (Exception ex) {
richTextBox3.Text += ex.Message + ex.StackTrace + "\n";
}
Когда приложение запускается на win 10, это нормально, но при запуске на windows server 2016 возникает ошибка: вы должны записать байты длины содержимого в поток запроса, прежде чем вызывать метод getresponse в InvalidOperationException
Может кто-нибудь помочь мне? Большое спасибо