我有启用发现功能的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>

任何想法为什么会这样?

最佳答案

通过IIS托管带有发现功能的服务时的几点注意事项

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

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

    服务配置
    <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());
    

    希望这可以帮助!

    关于c# - WCF发现.NET 4 : Problem with config/programmatically definition,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6097561/

    10-12 22:35