How to create a SOAP API request with Username Token in .Net

create a SOAP API request with Username Token
SharePoint deveopment training course

This c#.net tutorial explains, how to create a SOAP API request with user name token in .Net while connecting to web service.

Suppose I have a Web service URL which I want to retrieve the data from out side organization.

https://15.32.54.09:80/enjoySharePoint_HTTPRouter/enjoySharePointWebservice

Here I am using SOAP UI to call the secure web service using WCF. The SOAP header I need to generate to do this should contain a username, password and created mob… Here is a an example of a soap UI header that I use to hit the same service.

create a soap header request
create a soap header request

How to get the same information using C # code

Step 1: Open the Visual Studio – > Create a new console application

create a SOAP API request with Username Token
create a SOAP API request with Username Token

Step 2: Go to the references and add a service reference as per below screenshot.

create a soap header request
create a soap header request

Step 3: Add the above web service in your service reference and click on Go – > Change the namespace name to any custom name -> Click on OK after getting “GetUserInfo” function over here.

how to create a SOAP API request with Username Token
how to create a SOAP API request with Username Token

Step 4: Next, copy and paste the below code which we can used to get the service output

 [WebMethod]
        public string GetUserInfo()
        {
            Soap.UserDTO dto = new Soap.UserDTO();

            try
            {
                Soap.UserBeanSEIClient client = new Soap.UserBeanSEIClient();
                client.ClientCredentials.UserName.UserName = "rswain";
                client.ClientCredentials.UserName.Password = "password@123";
                ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback((sender, certificate, chain, sslPolicyErrors) => true);
                ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
                PasswordDigestBehavior behavior = new PasswordDigestBehavior("rswain", "password@123");
                client.Endpoint.Behaviors.Add(behavior);
                dto = client.getUserInfo("8873493980", "37232732", "kswain");
                var tem = dto;              
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return dto.cpyEngName;
        }

Note: Sometime we will get certificate issue while connecting to outside service. So here we will call to a method called PasswordDigestBehavior to generate the certificate automatically.

create a soap header request c#.net
create a soap header request c#.net

Step 6: Next create one more class called PasswordDigestBehavior and copy and paste the below code.

PasswordDigestBehavior.cs

using Microsoft.Web.Services3.Security.Tokens;
using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Web;
using System.Xml;

namespace COTCWS
{
    partial class PasswordDigestBehavior : IEndpointBehavior
    {


        public string Username { get; set; }
        public string Password { get; set; }


        public PasswordDigestBehavior(string username, string password)
        {
            this.Username = username;
            this.Password = password;
        }


        void IEndpointBehavior.AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
            return;// throw new NotImplementedException();
        }


        void IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
        {
            clientRuntime.MessageInspectors.Add(new PasswordDigestMessageInspector(this.Username, this.Password));

        }

        void IEndpointBehavior.ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
        {
            return;// throw new NotImplementedException();
        }

        void IEndpointBehavior.Validate(ServiceEndpoint endpoint)
        {
            return;// throw new NotImplementedException();
        }
    }


    partial class PasswordDigestMessageInspector : IClientMessageInspector
    {
        public string Username { get; set; }
        public string Password { get; set; }


        public PasswordDigestMessageInspector(string username, string password)
        {
            this.Username = username;
            this.Password = password;
        }


        void IClientMessageInspector.AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
        {
            return;// throw new NotImplementedException();
        }


        object IClientMessageInspector.BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
        {
            // Use the WSE 3.0 security token class
            UsernameToken token = new UsernameToken(this.Username, this.Password, PasswordOption.SendPlainText);

            // Serialize the token to XML
            XmlElement securityToken = token.GetXml(new XmlDocument());

            //
            MessageHeader securityHeader = MessageHeader.CreateHeader("Security", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", securityToken, false);
            request.Headers.Add(securityHeader);

            MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
            request = buffer.CreateMessage();
            try
            {
                System.IO.File.WriteAllText(@"c:\temp\testthord\" + DateTime.Now.ToString("MMddyyyyhhmmssfff") + ".xml", request.ToString());
            }
            catch { }

            // complete
            return Convert.DBNull;

            //throw new NotImplementedException();
        }
    }
}

Step 7: Next build the code and debug. Now you can get the output which is same as your SOAP UI output.

You may like following c#.net tutorials:

This is the process to retrieve result from SOAP API.

Check out Best Alternative to InfoPath -> Try Now

free sharepoint training

SharePoint Online FREE Training

JOIN a FREE SharePoint Video Course (3 Part Video Series)

envelope
envelope

About Rajkiran Swain

Rajkiran is currently working as a SharePoint Consultant in QATAR . Rajkiran having 6 + years of experience in Microsoft Technologies such as SharePoint 2019/2016/2013/2010, MOSS 2007,WSS 3.0, Migration, Asp.Net, C#.Net, Sql Server, Ajax, jQuery etc.He is C#Corner MVP (2 Times).

View all posts by Rajkiran Swain →