Отправить xml строку в API с клиентским сертификатом - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть приложение, пишущее 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

Может кто-нибудь помочь мне? Большое спасибо

...