Reputation: 769
I have following WCF Service
[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
}
}
}
Whenever I do a request with following SOAP Message
<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>
I get error
Object reference not set to an instance of an object
If I add a "InboundDelivery" node to the message it works.
<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>
However I cannot change the message since this is send by a third-party application. I tried adding properties as [MessageContract(IsWrapped=true)] to my service without any success. I'm very new to SOAP so any help is welcome. Thanks!
Upvotes: 1
Views: 104
Reputation: 776
MessageContarct could control the structure of soap message.
Below is my test code. But if you want to use messageContract, the return type should also be of type 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; }
}
If you don't want to use messageContract and couldn't control the client side. I think you should change the signature of your method. For example ,
string MT_InboundDelivery(string HeaderDetails);
Upvotes: 1