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

时间:2011-09-20 20:42:59

标签: c# wcf

这是我的第一个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());
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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

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

您可以在此here

上找到更多信息