C# 使用WCF将复杂类型传递给windows服务

C# 使用WCF将复杂类型传递给windows服务,c#,wcf,C#,Wcf,我有一个windows服务和winform前端应用程序。我需要能够调用并将数据往返传递给服务中的方法。我通过定义一个接口实现了这一点,并且可以毫无问题地传递字符串 [ServiceContract] public interface IStringReverser { [DataContractFormat] [OperationContract] string ReverseString(string value); } 我现在尝试返回一个复杂的数据类型,并对代码进行

我有一个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;
    }
}
我不太清楚数据是如何传输的。我得到一个错误:

格式化程序在尝试反序列化消息时引发异常:尝试反序列化参数时出错。InnerException消息为命名空间“”中的“EndElement”“ReverseStringResult”,不应为。应为元素“\u x003C\u Id\u x003E\u k\u 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();
    }
专用IStringReverser pipeProxy;
公共表格1()
{
初始化组件();
ChannelFactory httpFactory=
新渠道工厂(
新的BasicHttpBinding(),
新端点地址(
"http://localhost:8000/Reverse"));
管道工厂=
新渠道工厂(
新建NetNamedPipeBinding(),
新端点地址(
“净。pipe://localhost/PipeReverse"));
//IStringReverser httpProxy=httpFactory.CreateChannel();
pipeProxy=pipeFactory.CreateChannel();
}
我不明白错误信息或如何更正它。如何定义它如何反序列化?序列化是否正常?

使用数据协定:

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

这解决了错误,但我得到的数据是空的,意思是Id为0,名称为空。我甚至将DTO对象移动到StringReverser类的字段,认为它可能超出范围,但没有解决。我建议您一路后退。将从数据库(或任何地方)填充DTO的代码替换为伪代码,伪代码的作用类似于
DTO DTO=new DTO{Id=1,Name=“John”};返回dto您也可以尝试调试。这显然是问题的一部分-我不知道如何调试它,因为它位于windows服务中,必须安装并启动。我还按照建议初始化了对象,得到了相同的空结果。如果您返回常量数据,但没有收到任何数据,那么您就没有收到您返回的数据,并且应该怀疑您是否正在调用该服务。是否在每次生成后重新启动Windows服务?您可以使用调试->附加到进程来调试windows服务。