Как отправлять и получать ответы с помощью веб-API, с помощью ASP.NET с#
Я должен вызвать веб-API в XML, который использует EPP (Extensible Provisioning Protocol) и возвращает XML в качестве ответа. Мне также нужно использовать сертификат, чтобы вызвать его, но полученный ответ равен нулю. В PHP есть только пример кода, который работает.
eppClient.php
<?php require_once 'config.php'; require_once 'eppFunctions.php'; //Get XML variable via POST method $xmlStr = stripslashes(trim($_POST['xmlStr'])); $response = send_epp_request($USER_CERTIFICATE_FILE, $EPP_SERVER_URL, $xmlStr); if(!$response === false){ //Show Server Response as XML header("Content-type: application/xml"); echo $response; } ?>
config.php
<?php //Server URL Address For Sending XML $EPP_SERVER_URL = "api.site.com/submit"; //URL CERTIFICATE FILE $USER_CERTIFICATE_FILE = ""; ?>
eppFunctions.php
<?php function send_epp_request_form($USER_CERTIFICATE_FILE, $EPP_SERVER_URL, $xmlStr) { $XML = array('xmlStr' => $xmlStr); // create a new cURL resource $ch = curl_init(); //FALSE to stop cURL from verifying the peer's certificate curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //The name of a file containing a PEM formatted certificate. curl_setopt($ch, CURLOPT_SSLCERT, $USER_CERTIFICATE_FILE); //TRUE to return the transfer as a string of the return value of curl_exec() instead of outputting it out directly. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //The contents of the "User-Agent: " curl_setopt($ch, CURLOPT_USERAGENT, "IRNIC_EPP_Client_Sample"); //The URL to fetch. curl_setopt($ch, CURLOPT_URL,"https://$EPP_SERVER_URL"); //TRUE to do a regular HTTP POST. curl_setopt($ch, CURLOPT_POST, 1); //The full data to post in a HTTP "POST" operation. curl_setopt($ch, CURLOPT_POSTFIELDS, $XML); // grab URL and pass it to the browser $response = curl_exec($ch); if($response === false) { // echo Errors echo 'Curl error: ' . curl_error($ch); } // close cURL resource, and free up system resources curl_close ($ch); return $response; } function send_epp_request($USER_CERTIFICATE_FILE, $EPP_SERVER_URL, $xmlStr) { // create a new cURL resource $ch = curl_init(); //FALSE to stop cURL from verifying the peer's certificate curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //The name of a file containing a PEM formatted certificate. curl_setopt($ch, CURLOPT_SSLCERT, $USER_CERTIFICATE_FILE); //TRUE to return the transfer as a string of the return value of curl_exec() instead of outputting it out directly. curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //The contents of the "User-Agent: " curl_setopt($ch, CURLOPT_USERAGENT, "IRNIC_EPP_Client_Sample"); //TRUE to do a regular HTTP POST.This POST is the normal application/x-www-form-urlencoded kind, most commonly used by HTML forms. curl_setopt($ch, CURLOPT_POST, false); //The URL to fetch. curl_setopt($ch, CURLOPT_URL,"https://$EPP_SERVER_URL"); //The full data to post in a HTTP "POST" operation. curl_setopt($ch, CURLOPT_POSTFIELDS, $xmlStr); // grab URL and pass it to the browser $response = curl_exec($ch); if($response === false) { // echo Errors echo 'Curl error: ' . curl_error($ch); } // close cURL resource, and free up system resources curl_close ($ch); return $response; } ?>
Что я уже пробовал:
Я попробовал несколько способов, таких как WebClient, HttpWebRequest или HttpClient, но все они не дали никакого результата.
protected string WebApiCall (string Data, string Url) { //Url in https byte[] BytesOfData = Encoding.ASCII.GetBytes(Data); string CertFile = Server.MapPath("~/crt/abc.p12"); string CertKey = "abc"; string ResponseData = string.Empty; //ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; //ServicePointManager.ServerCertificateValidationCallback = (a, b, c, d) => true; ServicePointManager.Expect100Continue = true; X509Certificate2Collection SrvCertificate = new X509Certificate2Collection(); SrvCertificate.Import(CertFile, CertKey, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet); //X509Certificate2 SrvCertificate = new X509Certificate2(CertFile, CertKey); HttpWebRequest HttpWebRequest = (HttpWebRequest)WebRequest.Create(Url); HttpWebRequest.ClientCertificates = SrvCertificate; //HttpWebRequest.ClientCertificates.Add(SrvCertificate); HttpWebRequest.Method = "POST"; HttpWebRequest.Accept = "application/xml"; HttpWebRequest.ContentType = "application/xml"; HttpWebRequest.ContentLength = BytesOfData.Length; Stream RequestStream = HttpWebRequest.GetRequestStream(); RequestStream.Write(BytesOfData, 0, BytesOfData.Length); RequestStream.Close(); HttpWebResponse HttpWebResponse = (HttpWebResponse)HttpWebRequest.GetResponse(); if (HttpWebResponse.StatusCode == HttpStatusCode.OK) { Stream ResponseStream = HttpWebResponse.GetResponseStream(); ResponseData += new StreamReader(ResponseStream).ReadToEnd(); return ResponseData; } return null; }
Richard Deeming
Я не знаком с" EPP", но, возможно, эта библиотека может помочь:
CodeMakerInc/EppLib.NET: EppLib.NET является ли библиотека .NET, реализующая протокол расширяемой подготовки (EPP)[^]