2

我是 WCF 的新手,用谷歌搜索了这个问题,但无济于事。我基本上有 WCF 客户端/服务器应用程序,使用启用了 HTTPS 的 basicHttpBinding 作为传输。我想要的是能够使用一种通用方法发送各种类型的数据(即各种消息)。我在 WCF 服务中定义了这样的数据:

[DataContract]
public class Payment
{
[DataMember]
int Pay_id
{
    get { return Payment_Id; }
    set { Payment_Id = value; }
}
[DataMember]
...
etc.

除了付款、配置、更新、日志之外,我还将有其他课程。在 WCF 中是否可以仅编写和使用一个 [Operation Contract] 方法来发送这些自定义类对象中的任何一个?像

SendMessage (Payment p); 
SendMessage (Config c); 

而不是为每种新类型的消息编写新方法,我认为这是糟糕的设计选择(难以扩展)?截至目前,我似乎只能在 WCF 客户端代理中实例化 [OperationContract] 方法定义中说明的类型,所以如果是

SendMessage(GenericMessage message)

然后我不能使用

Payment payment = new Payment();

在客户端,即使 Payment 是 GenericMessage 的子类。

4

3 回答 3

3

检查这个答案:

在 WCF 中命名通用 DataContract

另外,如果您有以下方法:

SendMessage(ParentClass object)

您可以使用子类对象:

class ChildClass : ParentClass

只需向您的 wcf 客户端添加如下内容:

<system.runtime.serialization>
    <dataContractSerializer>
      <declaredTypes>
        <add type="Your.Namespace.ParentClass, Your.Assembly">
          <knownType type="Your.Namespace.ChildClass, Your.Asembly"/>
        </add>
      </declaredTypes>
    </dataContractSerializer>
  </system.runtime.serialization>

另外,看看这篇文章:

所有关于已知类型

于 2012-07-05T06:35:41.547 回答
0

如果您有一个基类(GenericMessage在您的示例中)的场景,您只需在操作合同上使用KnownType属性,如下所示:

[OperationContract]
[KnownType(typeof(Payment))]
[KnownType(typeof(Config))]
SendMessage(GenericMessage message);

如果您愿意,还可以在配置中指定已知类型。有关此处的更多信息: system.runtime.serialization config

不理想,但它有效。

如果您需要做完全不同的事情(因此每种类型的重载会更合适),您必须将Name放在 OperationContract 上,如下所示:

[OperationContract(Name ="SendPayment")]
SendMessage (Payment p); 

[OperationContract(Name ="SendConfig")]
SendMessage (Config c); 
于 2012-07-05T06:37:16.350 回答
0

签到Agatha,这是一个请求/响应模式。您对每个操作都有一个请求/响应。在客户端,您将请求添加到 Dispatcher,然后您可以请求响应或触发请求。

于 2012-07-05T06:40:39.407 回答