WCF Discovery .NET 4:配置/编程定义问题

时间:2011-05-23 13:02:56

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

我有一个启用发现的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>

为什么会发生这种情况?

2 个答案:

答案 0 :(得分:2)

当您通过IIS托管服务时,有很多事情

  1. 在服务配置中,确保服务名称与 类名,包括命名空间
  2. 您必须确保服务正在运行才能发现 它与客户。您可以手动浏览到服务的.svc文件 或使用AppFabric托管服务并将AutoStart设置为true(您 也可以在web.config中指定
  3. 在服务配置中,您必须发出您要去的类型 在客户端的查找条件中使用
  4. 以下是设置服务端点的服务器配置示例。请注意,服务“name”属性是实现服务的类的完整命名空间。

    服务配置

    <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());
    

    希望这有帮助!

答案 1 :(得分:0)

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