我是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的子类。
答案 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>
另外,请看一下这篇文章:
答案 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,然后您可以询问响应,或触发请求。