HttpWebRequest возвращает ошибку в C#, работает в простом примере PHP
У меня есть рабочий пример PHP, который делает свою работу, но не может сделать то же самое в.NET - возвращение
System.Net.WebException: запрос был прерван: не удалось создать безопасный канал SSL/TLS. в System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) в System.Net.HttpWebRequest.GetRequestStream() в
PHP-код:
$curl = curl_init();
$post_fields = "command=a&amount=".$var_amount."¤cy=981&client_ip_addr=192.168.0.88&description=UFCTEST&msg_type=SMS";
$submit_url = "https://ecommerce.........";
Curl_setopt($curl, CURLOPT_SSLVERSION, 1); //0
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_fields);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, '0');
curl_setopt($curl, CURLOPT_SSLCERT, getcwd().'/sert.pem');
curl_setopt($curl, CURLOPT_SSLKEYPASSWD, 'XXXXXXXX');
curl_setopt($curl, CURLOPT_URL, $submit_url);
$result = curl_exec($curl);
$info = curl_getinfo($curl);
.NET Code
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string addr1 = "https://ecommerce......";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(addr1);
req.Method = "POST"; // Post method
System.Net.ServicePointManager.ServerCertificateValidationCallback =
delegate
{
return true; // **** Always accept
};
req.KeepAlive = false;
req.ProtocolVersion = HttpVersion.Version10;
//Certificate with private key
string certName = "ecommerce.ufc.ge_5300954_merchant_wp";
string certpwd = "xxxxxxxx";
X509Certificate2 cert = new X509Certificate2(@"c:\WebSites\Demo\" + certName + ".pem", certpwd);
req.ServerCertificateValidationCallback =
delegate
{
return true; // **** Always accept
};
req.ClientCertificates.Add(cert);
//req.PreAuthenticate = false;
string langStr = "";
String XML = "command=a&amount=" + priceStr + "¤cy=981" + langStr + "&client_ip_addr=" + Request.UserHostAddress.ToString() + "&description=PaymentForEtendersServices&msg_type=SMS";//reader.ReadToEnd();
byte[] buffer = Encoding.ASCII.GetBytes(XML);
req.ContentLength = buffer.Length;
// Wrap the request stream with a text-based writer
Stream writer = req.GetRequestStream();
writer.Write(buffer, 0, buffer.Length);
writer.Close();
WebResponse rsp = req.GetResponse();
String post_response = "";
using (StreamReader responseStream = new StreamReader(rsp.GetResponseStream()))
{
}
Я пробовал много вариантов игнорирования ошибок сертификата или игры с версиями tls ssl и т. Д., Но ни одна из них, похоже, не работала. Я пробовал много вариантов игнорирования ошибок сертификации или игры с версиями tls ssl и т. Д., Но ни одна из них не работает.,
(о предложениях дублирования, я думаю, что я попробовал их все, ни один не решил мою проблему)
1 ответ
PHP либо доверяет вашей серверной стороне, либо пропускает проверку TLS, поэтому он работает. Как вы это тестируете? API на той же машине, с которой вы отправляете запросы? Проверьте это, может быть, это поможет, так как ошибка довольно необычная. https://support.microsoft.com/en-gb/help/980817/fix-a-net-framework-3-5-based-application-becomes-unresponsive-when-a
Я не знаю почему, но оказывается, что иногда указание правильного ContentLength может вызвать эту проблему. Просто удаляем req.ContentLength = buffer.Length; решил проблему.