For a deeper look into our World Check One API, look into:

Overview |  Quickstart |  Documentation |  Downloads

question

Upvotes
Accepted
1 0 0 2

Post requests not working with C# HttpClient

We are trying to integrate WorldCheck one API using C# HttpClient in out .Net core application. We always receive 401 UnAuthorized response when sending Post requests using C# HttpClient in out .Net Core application.

Same request payload and authorization signature works well with HttpWebRequest object which we can make sure that there is no issue with generating the authorisation header. HttpWebRequest object is obsolete in modern .Net core versions and static code analysing tools also complaining about it. Get requests are working fine with C# HttpClient. All the C# sample code available in this forum were written in HttpWebRequest which we cannot use for our implementation. Do you have working sample C# code using HttpClient instead of HttpWebRequest?


Here is the sample code using C# HttpClient.

public void SendRequestWithHttpClient()
        {
            DateTime dateValue = DateTime.UtcNow; 

            string date = dateValue.ToString("R");
            
            string apikey = "cf9c27ef-32ab-412a-XXXXXXXXXXXXXXXXXXX";
            string apisecret = "2my_api_secret";
            string gatewayurl = "/v2/";
            string gatewayhost = "api-worldcheck.refinitiv.com";

            string postData = Newtonsoft.Json.JsonConvert.SerializeObject(GenerateRequest());

            string msg = postData;
            UTF8Encoding encoding = new UTF8Encoding();
            byte[] byte1 = encoding.GetBytes(postData);

           
            string dataToSign = "(request-target): post " + gatewayurl + "cases/screeningRequest\n" +
                "host: " + gatewayhost + "\n" +   // no https only the host name
                "date: " + date + "\n" +          // GMT date as a string
                "content-type: " + "application/json" + "\n" +
                "content-length: " + byte1.Length + "\n" +
                 msg;

            string hmac = generateAuthHeader(dataToSign, apisecret);

          
            string authorisation = "Signature keyId=\"" + apikey + "\",algorithm=\"hmac-sha256\",headers=\"(request-target) host date content-type content-length\",signature=\"" + hmac + "\"";


            using var httpClient = new HttpClient();
            httpClient.BaseAddress = new Uri("https://api-worldcheck.refinitiv.com");
            httpClient.DefaultRequestHeaders.Clear();
            httpClient.DefaultRequestHeaders.Add("Authorization", authorisation);
            httpClient.DefaultRequestHeaders.Add("Date", date);
            httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Date = dateValue;
            //httpClient.DefaultRequestHeaders.Add("Content-Type", "appplication/json");
            //httpClient.DefaultRequestHeaders.Add("Content-Length", byte1.Length.ToString());


            var response = httpClient.PostAsync("/v2/cases/screeningRequest", new StringContent(postData,Encoding.UTF8, "application/json")).Result;

          
            if (response.IsSuccessStatusCode)
            {
                var responseText = response.Content.ReadAsStringAsync().Result;
                Console.WriteLine(responseText);
            }
        }

        public static string generateAuthHeader(string dataToSign, string apisecret)
        {
            byte[] secretKey = Encoding.UTF8.GetBytes(apisecret);
            HMACSHA256 hmac = new HMACSHA256(secretKey);
            hmac.Initialize();

            byte[] bytes = Encoding.UTF8.GetBytes(dataToSign);
            byte[] rawHmac = hmac.ComputeHash(bytes);
            Console.WriteLine("---rawHmac---");
            string hex = BitConverter.ToString(rawHmac).Replace("-", "");
            Console.WriteLine(hex);
            return (Convert.ToBase64String(rawHmac));
        }
#productc#authenticationscreening-api
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Hello @Ajith

Thank you for your participation in the forum. Is the reply below satisfactory in resolving your query?


If so please can you click the 'Accept' text next to the appropriate reply? This will guide all community members who have a similar question.

Thanks,


AHS


@Ajith

Hi,

Please be informed that a reply has been verified as correct in answering the question, and marked as such.

Thanks,

AHS

1 Answer

· Write an Answer
Upvotes
Accepted
246 2 0 1

Hi @Ajith ,

Thanks for reaching out to us !

Unfortunately, We don't have full sample code for HTTP client using C# however you can visit below documentation it has some code which might help you.

https://developers.lseg.com/content/dam/devportal/en_us/product-docs/wc1-api/documentation/v2/schema-reference/wc1-api-schema-reference-documentation.html#tag/case/operation/saveCase

1707461135385.png


Thanks

Vivek P


1707461135385.png (255.4 KiB)
icon clock
10 |1500

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.

Thanks Vivek for the prompt response,


As mentioned in the given sample code, Content-Type and Content-Length need to be passed inside the content headers. We were passing it in the request headers. Now it's working. Thanks

Write an Answer

Hint: Notify or tag a user in this post by typing @username.

Up to 2 attachments (including images) can be used with a maximum of 512.0 KiB each and 1.0 MiB total.