使用WCF将复杂类型传递给Windows服务

时间:2014-04-24 02:54:09

标签: c# wcf

我有一个Windows服务和winform前端应用程序。我需要能够调用并传递数据往返于服务中的方法。我通过定义一个接口来实现这一点,并且可以毫无问题地传递字符串。

[ServiceContract]
public interface IStringReverser
{
    [DataContractFormat]
    [OperationContract]
    string ReverseString(string value);
}

我现在正在尝试返回一个复杂的数据类型并修改了代码:

[ServiceContract]
public interface IStringReverser
{
    [DataContractFormat]
    [OperationContract]
    DTO ReverseString(string value);
}

[Serializable]
public class DTO
{
    public int Id { get; set; }
    public string Name { get; set; }
}

我的实施是这样的:

public class StringReverser : IStringReverser
{
    public DTO ReverseString(string value)
    {
        char[] retVal = value.ToCharArray();
        int idx = 0;
        for (int i = value.Length - 1; i >= 0; i--)
            retVal[idx++] = value[i];

        var dto = new DTO();
        dto.Name = retVal.ToString();
        dto.Id = 122;
        return dto;
    }
}

我并不特别知道数据是如何传输的。我收到一个错误:

  

格式化程序在尝试反序列化消息时抛出异常:尝试反序列化参数http://tempuri.org/:ReverseStringResult时出错。 InnerException消息是''EndElement''命名空间'http://tempuri.org/'中的'ReverseStringResult'不是预期的。期待元素'_x003C_Id_x003E_k__BackingField'。'。有关详细信息,请参阅InnerException。

在winform中,我正在创建与此的连接:

private IStringReverser pipeProxy;
    public Form1()
    {
        InitializeComponent();

        ChannelFactory<IStringReverser> httpFactory =
            new ChannelFactory<IStringReverser>(
              new BasicHttpBinding(),
              new EndpointAddress(
                "http://localhost:8000/Reverse"));

        ChannelFactory<IStringReverser> pipeFactory =
            new ChannelFactory<IStringReverser>(
              new NetNamedPipeBinding(),
              new EndpointAddress(
                "net.pipe://localhost/PipeReverse"));

        //IStringReverser httpProxy = httpFactory.CreateChannel();
        pipeProxy = pipeFactory.CreateChannel();
    }

我不明白错误信息或如何纠正错误信息。如何定义反序列化的方式?序列化好吗?

1 个答案:

答案 0 :(得分:1)

使用数据合同:

[DataContract]
public class DTO
{
    [DataMember]
    public int Id { get; set; }
    [DataMember]
    public string Name { get; set; }
}