Calling a webservice in C#, when the response is de-serialized, the values are all shown as null.

I have captured data using Fiddler and the I can see the XML data.

The request is as follows:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"
            xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
    <s:Header>
        <VsDebuggerCausalityData xmlns="http://schemas.microsoft.com/vstudio/diagnostics/servicemodelsink">
            uIDPoxpsAt2GhixHrH6i2gAkOR8AAAAAYKd3AIdbIUm9jK6F8GyWoHka0EgCtzpMpV5MZKq2eeUACQAA 
        </VsDebuggerCausalityData>
        <o:Security s:mustUnderstand="1"
                    xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
            <u:Timestamp u:Id="_0">
                <u:Created>2019-03-28T01:23:21.589Z</u:Created>
                <u:Expires>2019-03-28T01:28:21.589Z</u:Expires>
            </u:Timestamp>
            <o:UsernameToken u:Id="uuid-7e43c8af-1f07-42dd-89b5-6bc295e5d0f6-1">
                <o:Username>username</o:Username>
                <o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">password</o:Password>
            </o:UsernameToken>
        </o:Security>
    </s:Header>
    <s:Body>
        <CancelService xmlns="http://tempuri.org/">
            <request xmlns:a="http://schemas.datacontract.org/2004/07/Models" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <a:Required_Date i:nil="true"/>
                <a:Service_ID>R-PMSR-19001188</a:Service_ID>
                <a:Provider_Ref>Oliver_Disconnect_BB</a:Provider_Ref>
            </request>
        </CancelService>
    </s:Body>
</s:Envelope>

and the response is:

<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
                  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                  xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
                  xmlns:mod="http://schemas.datacontract.org/2004/07/Models">
    <soapenv:Body>
        <CancelServiceResponse xmlns="http://tempuri.org/">
            <CancelServiceResult>
                <Status_Code>FAILED</Status_Code>
                <Status_Description>Service_ID=R-PMSR-19001188 not found.</Status_Description>
                <Order_ID></Order_ID>
            </CancelServiceResult>
        </CancelServiceResponse>
    </soapenv:Body>
</soapenv:Envelope>

enter image description here

I am running out of ideas...

EDIT 1:

ServiceReference3.B2BServiceClient b2BServiceClient = new ServiceReference3.B2BServiceClient();
            var elements = b2BServiceClient.Endpoint.Binding.CreateBindingElements();
            elements.Find<SecurityBindingElement>().EnableUnsecuredResponse = true;
            b2BServiceClient.Endpoint.Binding = new CustomBinding(elements);

            ServiceReference3.CancelRequest cancelRequest = new ServiceReference3.CancelRequest
            {
                Service_ID = "R-PMSR-19001188",
                Provider_Ref = "Oliver_Disconnect_BB"
            };

            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;

            b2BServiceClient.ClientCredentials.UserName.UserName = "username";
            b2BServiceClient.ClientCredentials.UserName.Password = "password";

            ServiceReference3.Response response = b2BServiceClient.CancelService(cancelRequest);

EDIT 2: Further to this, I have seen the values in ExtensionData that is also being passed back in the response.

2 Answers

0
user2260040 On Best Solutions

Finally, figured out what the issue was. The Reference.cs generated from wsdl, the datacontract for the Response class had the wrong namespace.

Changing it to:

[System.Runtime.Serialization.DataContractAttribute(Name="Response", Namespace="http://tempuri.org/")]

from

[System.Runtime.Serialization.DataContractAttribute(Name="Response", Namespace="http://schemas.datacontract.org/2004/07/Models")]

solved the issue for now.

0
Ackelry Xu On

Your message has only three property Status_Code , Status_Description, Order_ID and your response object has more property.

WCF deserialize message by order, so if it doesn't find the property in your message at the place where you define the property, this may cause null value, even the property is in the response message.

So please include all the property in order in your response message.

Or you could try to specify the deserializing order of model by using Order property of DataMember.

 [DataContract]
public  class Parent
{
 // IsRequired is used to test whether has received the property

 // if not, it will show error. Order could change the order of the property in message 
    [DataMember(IsRequired = true,Order =2)]
    public int Field3 { get; set; }
   [DataMember(IsRequired = true,Order =1)]
   public int Field1 { get; set; }

}

Try to specify the order of Status_Code to first , Status_Description to second and so on to see whether this solve your problem.