Amir Hussein Khaniki Ответов: 1

Как отправлять и получать ответы с помощью веб-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)[^]

1 Ответов

Рейтинг:
1

Vincent Maverick Durano

Чтобы вызвать Web API из клиента .NET, см. раздел: Вызов веб-API из клиента .NET (C#) | Microsoft Docs[^]


Amir Hussein Khaniki

Я проверил его и не работал. Ваше предлагаемое решение также является базой JSON.

Vincent Maverick Durano

Что не работает? Вы получаете ошибки?

PS: веб-API тоже поддерживает XML: https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/json-and-xml-serialization

Ссылка, которую я вам отправил, - это ссылка на то, как вызвать Web API с помощью HTTPClient.