HttpWebRequest возвращает ошибку в C #, работает в простом примере PHP - PullRequest
0 голосов
/ 28 февраля 2019

У меня есть рабочий пример php, который выполняет свою работу, но не может сделать то же самое в .NET - возвращает

System.Net.WebException: запрос был прерван: не удалось создать SSL /TLS безопасный канал.в System.Net.HttpWebRequest.GetRequestStream (TransportContext & context) в System.Net.HttpWebRequest.GetRequestStream () в

php код:

$curl = curl_init();
$post_fields = "xxxxxx&msg_type=aaa";
$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 = "sss.xxx.ee_5300954_merchant_wp";
string certpwd = "xxxxxxxx";
X509Certificate2 cert = new X509Certificate2(@"c:\xxx\xxx\" + certName + ".pem", certpwd);

req.ServerCertificateValidationCallback =
    delegate
    {
        return true; // **** Always accept
    };

req.ClientCertificates.Add(cert);

//req.PreAuthenticate = false;

string langStr = "";
String XML = "description=xxxx&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 и т. Д.,но, похоже, ни один из них не работает.

(насчет предложений по дублированию, я думаю, что я все их перепробовал, но ни один из них не решил мою проблему)

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Я не знаю почему, но оказывается, что иногда указание правильного ContentLength может вызвать эту проблему.Просто удаляем req.ContentLength = buffer.Length;решил проблему.

0 голосов
/ 28 февраля 2019

PHP либо доверяет вашей серверной стороне, либо пропускает проверку TLS, поэтому он работает.Как вы это тестируете?API на той же машине, с которой вы отправляете запросы?Проверьте это, может быть, это поможет, так как ошибка довольно необычная.https://support.microsoft.com/en-gb/help/980817/fix-a-net-framework-3-5-based-application-becomes-unresponsive-when-a

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...