WCF:如何使用一种方法发送各种类型的消息

时间:2012-07-05 06:20:50

标签: c# wcf design-patterns client-server

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

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

我还会有除付款以外的课程,f.e。配置,更新,记录。是否可以在WCF中编写和使用一个[Operation Contract]方法来发送任何这些自定义类对象?像

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

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

SendMessage(GenericMessage message)

然后我就无法使用

Payment payment = new Payment();
客户端中的

,即使Payment是GenericMessage的子类。

3 个答案:

答案 0 :(得分:3)

检查这个答案:

Naming Generic DataContracts in WCF

如果您有以下方法:

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>

另外,请看一下这篇文章:

All About KnownTypes

答案 1 :(得分: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); 

答案 2 :(得分:0)

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