为什么我的第一个WCF服务器不工作(错误的值返回到客户端)

本文关键字:返回 客户端 错误 第一个 我的 WCF 服务器 工作 为什么 | 更新日期: 2023-09-27 18:09:25

这是我的第一个WCF服务器:

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
namespace Myns.MBClient
{
    [ServiceContract]
    public interface IManagementConsole
    {
        [OperationContract]
        ConsoleData GetData(int strategyId);
    }
    [ServiceContract]
    public class ConsoleData
    {
        private int currentIndicator;
        [OperationContract]
        public double GetCurrentIndicator()
        {
            return currentIndicator;
        }
        public void SetCurrentIndicator(int currentIndicator)
        {
            this.currentIndicator = currentIndicator;
        }
    }
    class ManagementConsole : IManagementConsole
    {
        public ConsoleData GetData(int strategyId)
        {
            ConsoleData data = new ConsoleData();
            data.SetCurrentIndicator(33);
            return data;
        }
    }
}

在客户端我只调用pipeProxy.GetData(0).GetCurrentIndicator()

为什么程序打印0而应该打印33 ?

客户端代码(我认为没有问题):

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;
using System.Text;
using Commons;
using myns.MBClient;
namespace myns.MBClientConsole
{
    class Program
    {
        static void Main(string[] args)
        {
            ChannelFactory<IManagementConsole> pipeFactory =
                new ChannelFactory<IManagementConsole>(
                    new NetNamedPipeBinding(),
                    new EndpointAddress(
                        "net.pipe://localhost/PipeMBClientManagementConsole"));
            IManagementConsole pipeProxy =
              pipeFactory.CreateChannel();
            while (true)
            {
                string str = Console.ReadLine();
                Console.WriteLine("pipe: " +
                  pipeProxy.GetData(0).GetCurrentIndicator());
            }
        }
    }
}

为什么我的第一个WCF服务器不工作(错误的值返回到客户端)

如果你创建自己的复杂类型来与WCF一起使用,你必须添加一个DataContract属性而不是ServiceContract,并且你应该使用用DataMember装饰的字段/属性。帮你自己一个忙,使用普通的dto (DataTransferObjects -只有字段/属性但没有行为的对象):

[DataContract]
public class ConsoleData
{
    [DataMember]
    public int CurrentIndicator {get;set;}
}

你可以在这里找到更多信息