SOAP WCF Wrapped Object引用未设置为对象的实例

问题描述 投票:1回答:1

我有以下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的新手,所以欢迎任何帮助。谢谢!

.net web-services wcf soap
1个回答
1
投票

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

以下是小提琴的结果。 enter image description here

如果您不想使用messageContract并且无法控制客户端。我认为你应该改变方法的签名。例如 ,

  string MT_InboundDelivery(string HeaderDetails);
© www.soinside.com 2019 - 2024. All rights reserved.