Click here to Skip to main content
15,897,518 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I have to call a web API in XML that use EPP (Extensible Provisioning Protocol) and returns a XML as response. I also need to use a certificate to call it, but the received response is null. There is only a sample code in PHP that works.

eppClient.php
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
<?php
//Server URL Address For Sending XML
$EPP_SERVER_URL = "api.site.com/submit";

//URL CERTIFICATE FILE
$USER_CERTIFICATE_FILE = "";
?>

eppFunctions.php
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;

}
?>


What I have tried:

I tried several ways like WebClient, HttpWebRequest or HttpClient, but all of them have no result.

C#
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;
    }
Posted
Updated 15-Jul-18 19:08pm
v2
Comments
Richard Deeming 17-Jul-18 12:46pm    

1 solution

To call Web API from a .NET client, see: Call a Web API From a .NET Client (C#) | Microsoft Docs[^]
 
Share this answer
 
Comments
Amir Hussein Khaniki 16-Jul-18 2:26am    
I had tested it and not working. Your suggested solution is also a JSON base.
Vincent Maverick Durano 16-Jul-18 6:46am    
What's not working? Are you getting errors?

PS: Web API does support XML too: https://docs.microsoft.com/en-us/aspnet/web-api/overview/formats-and-model-binding/json-and-xml-serialization

The link that I sent you is a reference on how to call Web API using HTTPClient.
Elliot Tyrel 24-Sep-21 6:46am    
Sorry for being late to the convo but I think Vincent the confusion here is the same one I am having with a current project. The EPP api does not use standard format of url/product/id it has a single base url to which you send an xml message - the message sent determines the response you do or dont get rather than the url you send the message to.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900