Search code examples
c#asp.netwcfclass-library

How to get wcf response in XML format which is referenced through service reference in class library project


// Created obj for wcf service
ServiceSummary.ImageService.ManagerServiceClient obj1 = new ServiceSummary.ImageService.ManagerServiceClient(); 

// Forming a request body
var request = new ImageService.GetImageRequest
                {
                    UserContextData = new ImageService.UserContextData
                    {
                        Country = Country.ToUpper(),
                        Region = Region.ToUpper()
                    },
                };

// Invoking GetImageResponse and storing result in response variable
var response = obj1.GetImageResponse(request);

The response is returned of type class - how to get the response in XML format instead?


Solution

  • I am a little confused that why we need that primitive XML data. But we can completely get the source message, SOAP message envelops by using IClientMessageInspector.
    https://learn.microsoft.com/en-us/dotnet/api/system.servicemodel.dispatcher.iclientmessageinspector?redirectedfrom=MSDN&view=netframework-4.8
    Here is an example, assumed that you call the service by using a client proxy.

    public class ClientMessageLogger : IClientMessageInspector
        {
            public void AfterReceiveReply(ref Message reply, object correlationState)
            {
                Console.WriteLine(reply);
            }
    
            public object BeforeSendRequest(ref Message request, IClientChannel channel)
            {
                return null;
            }
        }
        public class CustContractBehaviorAttribute : Attribute, IContractBehavior, IContractBehaviorAttribute
        {
            public Type TargetContract => typeof(IService);
    
            public void AddBindingParameters(ContractDescription contractDescription, ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
            {
                return;
            }
    
            public void ApplyClientBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, ClientRuntime clientRuntime)
            {
                clientRuntime.ClientMessageInspectors.Add(new ClientMessageLogger());
            }
    
            public void ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
            {
                return;
            }
    
            public void Validate(ContractDescription contractDescription, ServiceEndpoint endpoint)
            {
                return;
            }
    }
    

    Then apply the contract behavior on the automatically generated service contract.

        [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
        [System.ServiceModel.ServiceContractAttribute(ConfigurationName="ServiceReference1.IService")]
        [CustContractBehavior]
    public interface IService {
    

    Result.
    enter image description here
    Feel free to let me know if there is anything I can help with.