配置发布者
发布端最后一部分是WCF配置。如上述所提及的,我们选择使用MSMQ提供可靠的、异步的消息传递。过去编写MSMQ代码比较困难,但是对WCF编程模型而言,MSMQ与其他传输协议没什么区别。在我们的案例中,我们选择了NetMsmqBinding,NetMsmqBinding 为核心MSMQ特性提供了全面访问WCF功能(与MsmqIntegrationBinding不同,MsmqIntegrationBinding提供了更丰富的MSMQ支持,但是限制了WCF功能)。
如下是客户端的WCF的配置示例:
<system.serviceModel>
<bindings>
<netMsmqBinding>
<bindingname="TransactionalMsmqBinding"exactlyOnce="true"deadLetterQueue="System" />
</netMsmqBinding>
</bindings>
<client>
<endpointname="SubscriberXAccountEventNotification"
address="net.msmq://localhost/private/SubscriberX/accounteventnotification.svc"
binding="netMsmqBinding"bindingConfiguration="TransactionalMsmqBinding"
contract="MyProject.Contracts.IAccountEventNotification" />
<endpointname="SubscriberYAccountEventNotification"
address="net.msmq://localhost/private/SubscriberY/accounteventnotification.svc"
binding="netMsmqBinding"bindingConfiguration="TransactionalMsmqBinding"
contract="MyProject.Contracts.IAccountEventNotification" />
</client>
</system.serviceModel>
<bindings>
<netMsmqBinding>
<bindingname="TransactionalMsmqBinding"exactlyOnce="true"deadLetterQueue="System" />
</netMsmqBinding>
</bindings>
<client>
<endpointname="SubscriberXAccountEventNotification"
address="net.msmq://localhost/private/SubscriberX/accounteventnotification.svc"
binding="netMsmqBinding"bindingConfiguration="TransactionalMsmqBinding"
contract="MyProject.Contracts.IAccountEventNotification" />
<endpointname="SubscriberYAccountEventNotification"
address="net.msmq://localhost/private/SubscriberY/accounteventnotification.svc"
binding="netMsmqBinding"bindingConfiguration="TransactionalMsmqBinding"
contract="MyProject.Contracts.IAccountEventNotification" />
</client>
</system.serviceModel>
上述配置没什么特别的地方 – 需要关注的是 exactlyOnce=”true” 设置,这是事务队列必须的设置。另外就是 net.msmq:// 地址语法,这是NetMsmqBinding 协议所需要的