Webservice возвращает данные XML, C # видит значения как нулевые - PullRequest
1 голос
/ 28 марта 2019

При вызове веб-службы в C #, когда десериализован ответ, все значения отображаются как нулевые.

Я собрал данные с помощью Fiddler, и я могу видеть данные XML.

Запрос выглядит следующим образом:

<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>

и ответ:

<?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

У меня заканчиваетсяидей ...

РЕДАКТИРОВАТЬ 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);

РЕДАКТИРОВАТЬ 2: В дополнение к этому я видел значения в ExtensionData, которые также передаются обратно в ответе.

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Наконец-то разобрался, в чем проблема.Файл Reference.cs, сгенерированный из wsdl, объекта данных для класса Response, имел неправильное пространство имен.

Изменение его на:

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

из

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

решиловопрос на данный момент.

0 голосов
/ 29 марта 2019

Ваше сообщение имеет только три свойства Status_Code, Status_Description, Order_ID, а ваш объект ответа имеет больше свойства.

WCF десериализует сообщение по порядку, поэтому, если оно не находит свойство в вашем сообщении в том месте, гдеВы определяете свойство, это может привести к нулевому значению, даже если свойство находится в ответном сообщении.

Поэтому, пожалуйста, включите все свойства по порядку в ваше ответное сообщение.

Или вы можете попробоватьукажите порядок десериализации модели, используя свойство Order объекта 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; }

}

Попробуйте указать порядок Status_Code для первого, Status_Description для второго и т. д., чтобы увидеть, решит ли это вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...