WCF发现.NET 4:配置/以编程方式定义的问题

问题描述

|| 我有启用发现功能的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托管发现服务时的几件事 在服务配置中,确保服务名称与 类名称,包括名称空间 您必须先确保服务正在运行,然后才能发现 它与客户。您可以手动浏览到服务的.svc文件 或使用AppFabric托管服务并将AutoStart设置为true(您可以 也可以在web.config中指定) 在服务配置中,您必须发出要使用的类型 用于客户端的查找条件 这是设置服务端点的服务器配置示例。请注意,服务\“ 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());
希望这可以帮助!     ,您不能仅向客户项目添加服务参考吗?它将为您生成配置。