Home Articles

结合WCF路由和发现

Asked
Viewed 655 times
1

我正在尝试将WCF路由服务与Discovery结合使用,但似乎它们无法一起工作 . 这是我的情景:

来自客户端的请求来自路由服务 . 我希望路由服务使用发现来查找正确的 endpoints ,并将传入的消息发送到找到的 endpoints . 但是,路由服务向发现服务发送[http://tempuri.org]名称空间,因此发现服务无法通过该名称空间找到服务,因为它期望路由器服务上的传入消息的名称空间 .

我知道我正确配置了发现服务,因为如果我在客户端使用发现配置,它可以解析 endpoints . 但是在我的 生产环境 场景中无法在客户端进行发现 . 如果我不使用发现来解析 endpoints ,路由器服务也可以工作 .

这是我的路由和发现配置:

<routing>
  <filters>
    <filter name="GreetingsFilter" filterType="EndpointName" filterData="GreetingsRoutingEndpoint"/>
  </filters>
  <filterTables>
    <filterTable name="DefaultTable">
      <add filterName="GreetingsFilter" endpointName="GreetingsDiscoveryEndpoint"/>
    </filterTable>
  </filterTables>
</routing>

<client>
  <endpoint behaviorConfiguration="LoggingBehavior" binding="basicHttpBinding"
    contract="*" name="GreetingsDiscoveryEndpoint"
    kind="dynamicEndpoint" endpointConfiguration="dynamicEndpointConfiguration" />
</client>

<standardEndpoints>
  <dynamicEndpoint>
    <standardEndpoint name="dynamicEndpointConfiguration">
      <discoveryClientSettings>
        <endpoint address="http://server/DiscoveryProxy.svc" behaviorConfiguration="DiscoveryEndpointBehavior" binding="wsHttpBinding" bindingConfiguration="NoSecurityBinding" name="DiscoveryEndpoint" kind="discoveryEndpoint" endpointConfiguration="managedDiscoveryEndpointConfiguration"/>
      </discoveryClientSettings>
    </standardEndpoint>
  </dynamicEndpoint>

  <discoveryEndpoint>
    <standardEndpoint name="managedDiscoveryEndpointConfiguration" discoveryVersion="WSDiscovery11" discoveryMode="Managed"/>
  </discoveryEndpoint>
</standardEndpoints>

这里有一个小巧的图片,显示了发送到发现服务的内容 . (注意[http://tempuri]命名空间]:
Fiddler screenshot showing the http://tempuri namespace being send to the discovery service

如果我的情况可能,有人可以建议我吗?

1 Answer

  • 1

    我找到了解决方案 . 我必须在discoveryClientSettings元素中指定搜索条件 . 在这里,我可以明确说出我正在寻找的类型 . 我的standardEndpoints配置现在如下所示:

    <standardEndpoints>
      <dynamicEndpoint>
        <standardEndpoint name="dynamicEndpointConfiguration">
    
          <discoveryClientSettings>
            <endpoint address="http://server/DiscoveryProxy.svc" behaviorConfiguration="DiscoveryEndpointBehavior" binding="wsHttpBinding" bindingConfiguration="NoSecurityBinding" name="DiscoveryEndpoint" kind="discoveryEndpoint" endpointConfiguration="managedDiscoveryEndpointConfiguration" />
            <findCriteria>
              <types>
                <add name="IGreetingService" namespace="urn:poc:igreetingservice:v1"/>
              </types>
            </findCriteria>
          </discoveryClientSettings>
        </standardEndpoint>
      </dynamicEndpoint>
    
    
      <discoveryEndpoint>
        <standardEndpoint name="managedDiscoveryEndpointConfiguration" discoveryVersion="WSDiscovery11" discoveryMode="Managed"/>
      </discoveryEndpoint>
    </standardEndpoints>
    

Related