我需要开发一个 Windows Server 服务总线主题订阅者(是的,Windows Server 而不是 Azure),并且为了从阅读中抽象出来,启动工作线程,...,循环并利用 AppFabric 管理功能,我有以下想法:
- 开发 WCF 服务
- 定义 Windows Server 服务总线终结点
问题是:
- 发布者必须使用服务合同向主题发送消息吗?
- 配置文件应该是什么样的?
提前致谢。
我需要开发一个 Windows Server 服务总线主题订阅者(是的,Windows Server 而不是 Azure),并且为了从阅读中抽象出来,启动工作线程,...,循环并利用 AppFabric 管理功能,我有以下想法:
问题是:
提前致谢。
为了帮助将来的相关问题,这里是必需的配置
发布者和订阅者配置都需要扩展:
<extensions>
<behaviorExtensions>
<add name="transportClientEndpointBehavior" type="Microsoft.ServiceBus.Configuration.TransportClientEndpointBehaviorElement, Microsoft.ServiceBus, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</behaviorExtensions>
<bindingExtensions>
<add name="netMessagingBinding" type="Microsoft.ServiceBus.Messaging.Configuration.NetMessagingBindingCollectionElement, Microsoft.ServiceBus, Version=1.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</bindingExtensions>
</extensions>
注意:发布者和订阅者都需要 Microsoft.ServiceBus 程序集。该软件包在Nuget中可用。
订阅方配置:
<bindings>
<netMessagingBinding>
<binding name="messagingBinding" closeTimeout="00:03:00" openTimeout="00:03:00" receiveTimeout="00:03:00" sendTimeout="00:03:00" sessionIdleTimeout="00:01:00" prefetchCount="-1">
<transportSettings batchFlushInterval="00:00:01" />
</binding>
</netMessagingBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="securityBehavior">
<messageInterceptorBehavior/>
<transportClientEndpointBehavior>
<tokenProvider>
<windowsAuthentication>
<stsUris>
<stsUri value="https://[SERVER]:9355/[NAMESPACE]" />
</stsUris>
</windowsAuthentication>
</tokenProvider>
</transportClientEndpointBehavior>
</behavior>
<endpoint listenUri="sb://[SERVER]/[NAMESPACE]/[TOPIC]/Subscriptions/[SUBSCRIPTIONNAME]"
address="sb://[SERVER]/[NAMESPACE]/[TOPIC]"
behaviorConfiguration="securityBehavior" binding="netMessagingBinding"
bindingConfiguration="messagingBinding" name="InsuranceService"
contract="[WCF_CONTRACT_NAME]" />
发布者配置:
<bindings>
<netMessagingBinding>
<binding name="InsuranceService" closeTimeout="00:03:00" openTimeout="00:03:00"
receiveTimeout="00:03:00" sendTimeout="00:03:00" prefetchCount="-1"
sessionIdleTimeout="00:01:00">
<transportSettings batchFlushInterval="00:00:01" />
</binding>
</netMessagingBinding>
</bindings>
<behaviors>
<endpointBehaviors>
<behavior name="securityBehavior">
<messageInterceptorBehavior/>
<transportClientEndpointBehavior>
<tokenProvider>
<windowsAuthentication>
<stsUris>
<stsUri value="https://[SERVER]:9355/[NAMESPACE]" />
</stsUris>
</windowsAuthentication>
</tokenProvider>
</transportClientEndpointBehavior>
</behavior>
</endpointBehaviors>
</behaviors>
<client>
<endpoint address="sb://[SERVER]/[NAMESPACE]/[TOPIC]"
behaviorConfiguration="securityBehavior" binding="netMessagingBinding"
bindingConfiguration="InsuranceService" contract="PushVoucherService.ISubscriber"
name="InsuranceService" />
</client>
如何连接 WCF 和服务总线的基本机制在 Azure 和服务器版本之间是相同的。您可以使用这篇文章作为一个很好的起点:
两者之间的主要区别在于端点地址,以及如何处理身份验证(因为服务器中没有 ACS)。这篇文章有一些有用的信息。
现在,具体回答您的问题:
发布者在技术上可以直接推送到服务总线队列,但最好使用合同。这里的问题不是如何推送,而是如何以服务可以理解的方式构建消息。拥有 WCF 合同可以让您将序列化/反序列化抽象出来。
对于配置,典型的场景是有一个使用netMessagingBinding的 WCF 服务。我提到的第一篇文章有关于配置的信息。只需确保更新身份验证和端点地址片段以匹配服务总线服务器。