代码之家  ›  专栏  ›  技术社区  ›  Terrance

在客户端和主机之间共享对象的WCF

  •  2
  • Terrance  · 技术社区  · 15 年前

        //Service---------------------------------------------------------
        [DataMember]
        private List<CalculationRecord> History = new List<CalculationRecord>();
    
        public IEnumerable<CalculationRecord> CalculationHistory()
        {
            return (IEnumerable<CalculationRecord>)History;
        }
    
        public CalculationResult Calculate(CalculationNode problem)
        {
            CalculationResult calcResult = new CalculationResult();
    
    
            //Calculates results of expression
            CalculationEvaluation Evaluator = new CalculationEvaluation();
            Evaluator.Calculate(problem, calcResult);
    
            return calcResult;
        }
        //interface---------------------------------------------------------
        [ServiceContract]
        public interface ICalculate
        {
            [OperationContract]
            CalculationResult Calculate(CalculationNode problem);
    
            [OperationContract]
            IEnumerable<CalculationRecord> CalculationHistory();
        }
    
        //Client------------------------------------------------------------
        CalculatorClient client = new CalculatorClient();
        ICalculate calcProxy = client.ChannelFactory.CreateChannel();
    
        CalculationNode calcRootNode = parser.Parse(expression);
        CalculationResult result = calcProxy.Calculate(calcRootNode);//result is null
    
    1 回复  |  直到 15 年前
        1
  •  4
  •   marc_s    15 年前

    你有一个错误的印象-服务器公开的数据契约可以(而且应该) 只有 包含数据-从不包含任何行为。因此,你可以 从未 在客户机和主机之间共享一个对象—您所能共享的只是要调用的服务方法,以及在这些方法上使用的具体类型。就这样。

    不能 推断数据契约上的任何其他方法。它就是不能。然后,客户机构建数据协定类型的精确副本—但它是一个完全独立的类,并且它只匹配服务器端数据协定类(就其在XML中的序列化表示而言)。它是 同一类-只是看起来一样。

    -基本上是一个XML文本文档。你是 通过.NET对象发送!您所交换的只是数据契约的数据表示,仅此而已。

    包含 Calculate 你调用的方法在服务合同上-它是

    在您的具体示例中,您似乎混合了[DataMember]和服务接口定义。不惜一切代价避免这种情况。另外,所有参与计算的类型-最肯定的是 CalculationNode CalculationResult -必须公开为包含许多[DataMember]字段或属性的[DataContract]元素。这在你发布的代码片段中并不清楚。