【问题标题】:WCF Discovery .NET 4: Problem with config / programmatically definitionWCF Discovery .NET 4:配置/编程定义问题
【发布时间】:2011-08-31 03:39:29
【问题描述】:

我有一个启用了发现的 WCF 服务,现在我想将客户端连接到它。

问题:当我使用 udp 端点 (1.) 并尝试以编程方式发现服务时,它可以工作...当我使用 App.config 方法 (2.) 时,它不会(错误:未发现端点) .

在我看来,这两种解决方案的“udp 发现结果”应该是相同的,但不幸的是它不是......

1.以编程方式处理(有效)

代码:

        DiscoveryClient discClient = new DiscoveryClient("udpDiscoveryEndpoint");
        FindCriteria fCriteria = new FindCriteria(typeof(IAlarmServer));
        fCriteria.Duration = TimeSpan.FromSeconds(5);
        fCriteria.MaxResults = 1;
        FindResponse fResponse = discClient.Find(fCriteria);

        EndpointAddress address = fResponse.Endpoints[0].Address;
        Console.WriteLine("Address found: " + address.ToString());

配置:

<system.serviceModel>
  <client>
     <endpoint name="udpDiscoveryEndpoint" kind="udpDiscoveryEndpoint" />
  </client>
</system.serviceModel>

2。 App.config 方法和“集成到端点”方法(不起作用!):

代码:

        var Proxy = new AlarmServerClient("IAlarmServer"); // Default client generated by Visual Studio
        Proxy.SomeMethod(); // throw no endpoints discovered exception

配置:

<standardEndpoints>
  <dynamicEndpoint>
    <standardEndpoint name="discoveryDynamicEndpointConfiguration">
      <discoveryClientSettings>
        <findCriteria duration="00:00:05" maxResults="1">
          <types>
            <add name="AlarmServiceRef.IAlarmServer"/>
          </types>
        </findCriteria>
        <endpoint kind="udpDiscoveryEndpoint"/>
      </discoveryClientSettings>
    </standardEndpoint>
  </dynamicEndpoint>
</standardEndpoints>

配置:

  <client>
     <endpoint binding="basicHttpBinding" bindingConfiguration="DefaultBasicHttpBinding" contract="AlarmServiceRef.IAlarmServer" name="IAlarmServer"
            kind="dynamicEndpoint"
            endpointConfiguration="discoveryDynamicEndpointConfiguration"/>
  </client>

任何想法为什么会发生这种情况?

【问题讨论】:

  • 这种类型是强命名的吗?

标签: c# .net wcf .net-4.0 wcf-binding


【解决方案1】:

当您通过 IIS 托管具有发现功能的服务时的几件事

  1. 在服务配置中确保服务名称与 包含命名空间的类名
  2. 您必须确保服务正在运行,然后才能发现 它与客户。您可以手动浏览到服务的 .svc 文件 或使用 AppFabric 托管服务并将 AutoStart 设置为 true(您 也可以在web.config中指定)
  3. 在服务配置中,您必须发出您要使用的类型 在客户端的查找条件中使用

这是设置服务端点的服务器配置示例。请注意,服务“名称”属性是实现该服务的类的完整命名空间。

服务配置

<services>
      <service name="WcfDiscovery.Services.BuzzerService" behaviorConfiguration="sb1" >
        <endpoint binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" address="" behaviorConfiguration="eb1"  />
        <endpoint kind="udpDiscoveryEndpoint"  />
      </service>
    </services>

还要确保将发现行为添加到服务中

服务配置

<serviceBehaviors>
        <behavior name="sb1">
          <serviceMetadata httpGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="false"/>
          <serviceDiscovery />
        </behavior>
      </serviceBehaviors>

由于我希望客户端能够按类型 (WcfDiscovery.Contracts.IAlarmServer) 发现服务,因此我还必须在端点 (eb1) 的行为配置中指定这一点

服务配置

<endpointBehaviors>
        <behavior name="eb1">
          <endpointDiscovery enabled="true">
            <types>
              <add name="WcfDiscovery.Contracts.IAlarmServer" />
            </types>
          </endpointDiscovery>
        </behavior>
      </endpointBehaviors>

现在在客户端,我可以使用 findCriteria 发现服务。请注意,查找条件中的类型必须与服务发出的类型相匹配(在服务类型列表中)

客户端配置

<standardEndpoints>
      <dynamicEndpoint>
        <standardEndpoint name="dynamicEndpointConfiguration">
          <discoveryClientSettings >
            <endpoint kind="udpDiscoveryEndpoint" />

            <findCriteria maxResults="2">
              <types>
                <add name="WcfDiscovery.Contracts.IAlarmServer" />
              </types>
            </findCriteria>

          </discoveryClientSettings>
        </standardEndpoint>
      </dynamicEndpoint>
    </standardEndpoints>

这是客户端端点配置

客户端配置

<client>
      <endpoint kind="dynamicEndpoint" name="endpoint" binding="basicHttpBinding" contract="WcfDiscovery.Contracts.IAlarmServer" endpointConfiguration="dynamicEndpointConfiguration" />
    </client>

最后,我可以像这样在控制台应用中发现该服务:

ChannelFactory<IAlarmServer> factory = new ChannelFactory<IAlarmServer>("endpoint");
            var proxy = factory.CreateChannel();

            Console.WriteLine(proxy.SoundAlarm());

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    您不能只为您的客户项目添加一个服务引用吗?它将为您生成配置。

    【讨论】:

    • 不行,因为它会生成一个固定ip/地址的引用
    • 是的,但您可以在实例化代理时覆盖它。
    • 当然,但我仍然没有有效的 udp 发现配置,这首先是我的问题 ;)
    猜你喜欢
    • 1970-01-01
    • 2011-11-29
    • 2011-11-21
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 2011-02-21
    相关资源
    最近更新 更多