C# WCF发现根本不存在';行不通

C# WCF发现根本不存在';行不通,c#,wcf,discovery,service-discovery,C#,Wcf,Discovery,Service Discovery,我正在尝试将临时发现添加到简单的WCF服务客户端设置中(目前通过控制台应用程序中的自托管实现)。在Windows7上使用VS2010进行调试,并尽我所能在在线教程中找到,但发现客户端仍然什么也找不到。不用说,如果我打开一个指向正确服务端点的客户端,我就可以从客户端访问服务 服务代码: using (var selfHost = new ServiceHost(typeof(Renderer))) { try { selfHost.Open(); .

我正在尝试将临时发现添加到简单的WCF服务客户端设置中(目前通过控制台应用程序中的自托管实现)。在Windows7上使用VS2010进行调试,并尽我所能在在线教程中找到,但发现客户端仍然什么也找不到。不用说,如果我打开一个指向正确服务端点的客户端,我就可以从客户端访问服务

服务代码:

using (var selfHost = new ServiceHost(typeof(Renderer)))
{
    try
    {
        selfHost.Open();
        ...
        selfHost.Close();
服务app.config:

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="TestApp.Renderer">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:9000" />
          </baseAddresses>
        </host>
        <endpoint address="ws" binding="wsHttpBinding" contract="TestApp.IRenderer"/>
        <endpoint kind="udpDiscoveryEndpoint"/>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceDiscovery/>
          <serviceMetadata httpGetEnabled="True"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>
“endpoints”集合始终为空。我尝试过从调试器、命令行、管理命令行运行服务和客户机,但都没有用(当然,都是在本地计算机上,而不是在mantion上,我最终需要它在整个子网上运行)


任何帮助都将不胜感激:-)

这里是一个超级简单的发现示例。它不使用配置文件,全部是c代码,但您可能可以将概念移植到配置文件

在主机和客户端程序之间共享此接口(暂时复制到每个程序)

将此代码放入宿主程序

public class WcfPingTest : IWcfPingTest
{
  public const string magicString = "djeut73bch58sb4"; // this is random, just to see if you get the right result
  public string Ping() {return magicString;}
}
public void WcfTestHost_Open()
{
  string hostname = System.Environment.MachineName;
  var baseAddress = new UriBuilder("http", hostname, 7400, "WcfPing");
  var h = new ServiceHost(typeof(WcfPingTest), baseAddress.Uri);

  // enable processing of discovery messages.  use UdpDiscoveryEndpoint to enable listening. use EndpointDiscoveryBehavior for fine control.
  h.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
  h.AddServiceEndpoint(new UdpDiscoveryEndpoint());

  // enable wsdl, so you can use the service from WcfStorm, or other tools.
  var smb = new ServiceMetadataBehavior();
  smb.HttpGetEnabled = true;
  smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
  h.Description.Behaviors.Add(smb);

  // create endpoint
  var binding = new BasicHttpBinding(BasicHttpSecurityMode.None);
  h.AddServiceEndpoint(typeof(IWcfPingTest) , binding,   "");
  h.Open();
  Console.WriteLine("host open");
}
将此代码放入客户端程序

private IWcfPingTest channel;
public Uri WcfTestClient_DiscoverChannel()
{
  var dc = new DiscoveryClient(new UdpDiscoveryEndpoint());
  FindCriteria fc = new FindCriteria(typeof(IWcfPingTest));
  fc.Duration = TimeSpan.FromSeconds(5);
  FindResponse fr = dc.Find(fc);
  foreach(EndpointDiscoveryMetadata edm in fr.Endpoints) 
  {
    Console.WriteLine("uri found = " + edm.Address.Uri.ToString());
  }
  // here is the really nasty part
  // i am just returning the first channel, but it may not work.
  // you have to do some logic to decide which uri to use from the discovered uris
  // for example, you may discover "127.0.0.1", but that one is obviously useless.
  // also, catch exceptions when no endpoints are found and try again.
  return fr.Endpoints[0].Address.Uri;  
}
public void WcfTestClient_SetupChannel()
{
  var binding = new BasicHttpBinding(BasicHttpSecurityMode.None);
  var factory = new ChannelFactory<IWcfPingTest>(binding);
  var uri = WcfTestClient_DiscoverChannel();
  Console.WriteLine("creating channel to " + uri.ToString());
  EndpointAddress ea = new EndpointAddress(uri);
  channel = factory.CreateChannel(ea);
  Console.WriteLine("channel created");
  //Console.WriteLine("pinging host");
  //string result = channel.Ping();
  //Console.WriteLine("ping result = " + result);
}
public void WcfTestClient_Ping()
{
  Console.WriteLine("pinging host");
  string result = channel.Ping();
  Console.WriteLine("ping result = " + result);
}
主机输出应该如下所示

host open
uri found = http://wilkesvmdev:7400/WcfPing
creating channel to http://wilkesvmdev:7400/WcfPing
channel created
pinging host
ping result = djeut73bch58sb4
客户端输出应该如下所示

host open
uri found = http://wilkesvmdev:7400/WcfPing
creating channel to http://wilkesvmdev:7400/WcfPing
channel created
pinging host
ping result = djeut73bch58sb4

这真的是我能为一个发现示例提出的最低要求。这东西很快就变得复杂了。

该死!是防火墙。。。由于某种原因,所有UDP通信都被阻止-禁用防火墙解决了问题。现在,我只需要找出正确的防火墙配置…

我还尝试在serviceDiscovery行为中添加公告端点-这也没有帮助-客户端是否有app.config信息?您是否尝试添加作用域?是的,客户端的app.config是由svcuti.exe自动生成的。还尝试了服务端的Security=none(从客户端app.config中删除了角色)。不,没有尝试添加作用域,主要是因为我没有看到任何合适的示例:-)-最简单的方法是什么?你知道如何配置防火墙吗?我也有同样的问题。是的,发现依赖于UDP爆炸来定位服务
uri found = http://wilkesvmdev:7400/WcfPing
creating channel to http://wilkesvmdev:7400/WcfPing
channel created
pinging host
ping result = djeut73bch58sb4