Ссылка обернутого объекта SOAP WCF не установлена ​​на экземпляр объекта - PullRequest
1 голос
/ 11 апреля 2019

У меня есть следующий сервис WCF

[ContractType(ContractKnownType.CORE)]
[ServiceContract(Namespace = WcfConstants.WcfNamespace), ServiceBehavior(Namespace = WcfConstants.WcfNamespace)]
[HostAsWebService]
[XmlSerializerFormat]
public class DeliveryWebService : IFactoryService
{
    [OperationContract, Sessional]
    public string InboundDelivery(MT_InboundDelivery MT_InboundDelivery)
    {
        var error = "";
        try
        {
            ... some code
        }
    }
}

Всякий раз, когда я делаю запрос со следующим SOAP-сообщением

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.MEScontrol.net/WebServices">
  <soapenv:Header/>
     <soapenv:Body>
         <web:MT_InboundDelivery>
             <web:HeaderDetails/>
         </web:MT_InboundDelivery>
     </soapenv:Body>
</soapenv:Envelope>

Я получаю ошибку

Ссылка на объект не установлена ​​для экземпляра объекта

Если я добавлю узел «InboundDelivery» к сообщению, оно будет работать.

 <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://www.MEScontrol.net/WebServices">
  <soapenv:Header/>
     <soapenv:Body>
       <web:InboundDelivery>
           <web:MT_InboundDelivery>
             <web:HeaderDetails/>
           </web:MT_InboundDelivery>
         <web:InboundDelivery>
     </soapenv:Body>
</soapenv:Envelope>

Однако я не могу изменить сообщение, так как оно отправлено сторонним приложением. Я попытался добавить свойства как [MessageContract (IsWrapped = true)] к моему сервису, но безуспешно. Я очень новичок в SOAP, поэтому любая помощь приветствуется. Спасибо!

1 Ответ

1 голос
/ 12 апреля 2019

MessageContarct может управлять структурой мыльного сообщения.

Ниже приведен мой тестовый код. Но если вы хотите использовать messageContract, тип возвращаемого значения также должен иметь тип MT_InboundDelivery

public class DeliveryWebService : IFactoryService
{
    public MT_InboundDelivery InboundDelivery(MT_InboundDelivery MT_InboundDelivery)
    {

        return MT_InboundDelivery;
    }
}
 [ServiceContract(Namespace = "http://www.MEScontrol.net/WebServices")]

public interface IFactoryService
{
    [OperationContract]
    MT_InboundDelivery InboundDelivery(MT_InboundDelivery MT_InboundDelivery);
}


[MessageContract(IsWrapped = true)]
public class MT_InboundDelivery
{
    [MessageBodyMember]
    public string HeaderDetails { get; set; }
}

Ниже приведен результат скрипки. enter image description here

Если вы не хотите использовать messageContract и не можете контролировать клиентскую часть. Я думаю, что вы должны изменить подпись вашего метода. Например,

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