3

我需要开发一个 Windows Server 服务总线主题订阅者(是的,Windows Server 而不是 Azure),并且为了从阅读中抽象出来,启动工作线程,...,循环并利用 AppFabric 管理功能,我有以下想法:

  • 开发 WCF 服务
  • 定义 Windows Server 服务总线终结点

问题是:

  1. 发布者必须使用服务合同向主题发送消息吗?
  2. 配置文件应该是什么样的?

提前致谢。

4

2 回答 2

3

为了帮助将来的相关问题,这里是必需的配置

发布者和订阅者配置都需要扩展

<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>
于 2013-05-09T10:54:14.640 回答
3

如何连接 WCF 和服务总线的基本机制在 Azure 和服务器版本之间是相同的。您可以使用这篇文章作为一个很好的起点

两者之间的主要区别在于端点地址,以及如何处理身份验证(因为服务器中没有 ACS)。这篇文章有一些有用的信息。

现在,具体回答您的问题:

  • 发布者在技术上可以直接推送到服务总线队列,但最好使用合同。这里的问题不是如何推送,而是如何以服务可以理解的方式构建消息。拥有 WCF 合同可以让您将序列化/反序列化抽象出来。

  • 对于配置,典型的场景是有一个使用netMessagingBinding的 WCF 服务。我提到的第一篇文章有​​关于配置的信息。只需确保更新身份验证和端点地址片段以匹配服务总线服务器。

于 2013-05-01T23:39:53.113 回答