在 SOAP 消息中将复杂类型作为参数发送

Abd*_*ken 5 wcf soap complextype

我有一个 WCF 服务,如下所示:

 public class Service1 : IService1
{
    public string GetData(Person person)
    {
        if (person != null)
        {
            return "OK";
        }
        return "Not OK!";
    }
Run Code Online (Sandbox Code Playgroud)

这是我的 Person 类:

 [DataContract]
public class Person
{
    [DataMember]
    public int Age { get; set; }

    [DataMember]
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在调用这样的服务:

 BasicHttpBinding binding = new BasicHttpBinding(BasicHttpSecurityMode.None);
        IChannelFactory<IRequestChannel> factory = binding.BuildChannelFactory<IRequestChannel>(new BindingParameterCollection());
        factory.Open();

        EndpointAddress address = new EndpointAddress(url);
        IRequestChannel irc = factory.CreateChannel(address);
        using (irc as IDisposable)
        {
            irc.Open();
            string soapMessage = "<GetData><person><Age>24</Age><Name>John</Name></person></GetData>";

            XmlReader reader = XmlReader.Create(new StringReader(soapMessage));
            Message m = Message.CreateMessage(MessageVersion.Soap11,"http://tempuri.org/IService1/GetData", reader);

            Message ret = irc.Request(m);
            reader.Close();
            return ret.ToString();
        }
Run Code Online (Sandbox Code Playgroud)

当我尝试将像 Person 这样的复杂类型作为参数发送给 GetData 方法时,person 对象变为 null。但是当我发送已知类型(如整数、字符串等)作为参数时,我没有问题。

如何将复杂类型作为参数发送到服务方法?

And*_*wis 1

我遇到了类似的情况,我们最终将服务的接口更改为相当于:

public string GetData(string person)
Run Code Online (Sandbox Code Playgroud)

我们在调用 Web 服务之前进行了自己的对象序列化。我们会立即在 Web 服务方法中对其进行反序列化,然后正常进行。