我有以下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的新手,所以欢迎任何帮助。谢谢!
MessageContarct可以控制soap消息的结构。
下面是我的测试代码。但是如果要使用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; }
}
如果您不想使用messageContract并且无法控制客户端。我认为你应该改变方法的签名。例如 ,
string MT_InboundDelivery(string HeaderDetails);