【问题标题】:WCF service contract; calling a class method from clientWCF服务合同;从客户端调用类方法
【发布时间】:2014-01-12 17:17:38
【问题描述】:

使用 WCF 服务我遇到了以下问题:从客户端调用服务(简单的控制台应用程序),我无法访问标有 [DataContract] 和 [ServiceContract] 的类的方法,即使该方法被标记使用 [OperationContract] (实际上,到目前为止,我已经尝试了所有可能的属性组合:D)。有没有办法解决它?我想我在这里遗漏了一些要点,但仍然无法处理,需要帮助^^ 这是一个类的代码:

[ServiceContract]
[DataContract]
public class AmountSpecification : IOrderSpecification
{
    [DataMember]
    public int Amount {get ; set;}

    public AmountSpecification(int amount)
    {
        Amount = amount;
    }
    public bool IsSatisfiedBy(Order o)
    {
        return o.Amount >= Amount;
    }

    [OperationContract]
    public IOrderSpecification And(IOrderSpecification specification)
    {
        return new AndSpecification(this, specification);
    }

}

【问题讨论】:

  • 您应该将代码添加到您的问题中。
  • 您应该使用 ServiceContract 装饰您的服务 - 或者更好的是 IOrderSpecification 应该使用 ServiceContract 装饰,然后使用 DataContract 和 DataMember 属性创建单独的数据类
  • 已经这样装饰了:(

标签: c# wcf


【解决方案1】:

您的方法返回 IOrderSpecification。

因此,在客户端,没有指示使用哪个实现(AmountSpecification、AndSpecification 等),因此客户端不会创建正确的实例类型。

您需要在您的界面上添加Well Known Types attribute。这将允许 wsdl 包含实现的定义,因此客户端将获得信息。

【讨论】:

  • 但是是否允许将已知类型与接口相关联?好像不是这样的……
  • 所以,你只需要使用基类而不是接口
  • 所以我最终创建了一个基类而不是接口,并使用复合规范而不是在客户端代码中编写规范。感谢您的所有建议!
【解决方案2】:

您将服务合同和数据合同混为一谈。您只需要 DataContractDataMember 属性来创建数据协定,甚至不需要这些。

但是,当您使用此数据协定从服务生成服务引用,并且您要添加服务引用的项目没有对定义 AmountSpecification 的程序集的引用时,它将生成一个仅具有给定名称和属性的数据合同。

如果您想完整地使用该类,您必须在您的客户端应用程序中引用该类定义的程序集,并在您的服务引用配置中选中“在引用的程序集中重用类型”。见Service reference complex types

【讨论】:

  • 感谢您的评论,但我已经这样做了 :( 不幸的是对我不起作用
  • “不起作用”不是错误。删除服务引用,添加对定义 AmountSpecification 的程序集的引用,并重新创建服务引用,并选中“重用引用程序集中的类型”。
  • 已经完成 :) 获取“...AmountSpecification 不包含'And'的定义...”
  • 当您右键单击AmountSpecification 并选择转到定义 (F12) 时,您会去哪里?您是否在更新服务参考之前重建了项目?
  • 我转到控制台项目中序列化的自动生成文件。是的,我确定我重建了项目
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 2011-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多