WCF绑定,契约,知识类型

时间:2012-06-02 01:10:22

标签: wcf msmq

我之前已经能够在原型项目中做到这一点但是因为现在它正在进入项目中包含其他内容的“实现”,所以我在WCF能够接收消息方面遇到了一些问题来自MSMQ。

解决方案的结构是我们拥有“团队”。每个项目都代表了这一点(在某种程度上)。 团队只能访问他们需要的项目。

所以:

IncomingMessaging项目(引用“Messages”项目)

这包含的类是从其自己类型的基类派生的具体类(在“Messages”项目中)。基类都在“消息”项目中。例如:

FirstReport -> FirstReportBase
SecondReport -> SecondReportBase
ThirdReport -> ThirdReportBase

每个基类都来自“MainBase”。这也存在于“消息”项目中。 MainBase已使用KnownTypes属性进行修饰,并具有所有基本已知类型。 (FirstReportBase,SecondReportBase等......)

然后我有一个WCFImplementation.Messages项目,它引用了“Messages”和“IncomingMessaging”项目。 WCFImplementation.Messages项目有一个具体的类,用于WCF绑定到MSMQ的实际实现,如下所示:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class InboundMessagingService : IInboundMessagingService
{
   [OperationBehavior(TransactionScopeRequired = true)]
   public void ProcessIncomingMessage(MsmqMessage<MainBase> msg) { ... }
}

IInboundMessagingService具有ServiceContract属性,并且还具有所有基类型的ServiceKnownType属性

和我一起到目前为止?

然后我有一个简单的Console应用程序项目来托管服务。请注意,此时我已将FirstReport消息发送到队列:

FirstReport fr = new FirstReport(....);

控制台应用程序已运行,我收到了故障服务。它无法读取队列中的消息! (有毒信息)

我错过了什么? 是否必须使用具体类来装饰IInboundMessagingService的接口?我不能只使用基类吗?

我之前使用原型,因为我将具体(FirstReport)和基类(FirstReportBase)装饰为接口中的服务已知类型,但这是一个“松散”类型的项目结构

1 个答案:

答案 0 :(得分:0)

问题似乎是对象和子对象等......都需要使用DataContract属性进行标记。 然后,主要的具体/基类应该具有用已知类型装饰的知识类型属性,这些属性是该基类的子类。