这个简单的WCF发现示例适用于单台计算机,但是当客户端和服务器在同一子网中没有防火墙的不同计算机上运行时,它不起作用。我错过了什么?
using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.ServiceModel;
using System.ServiceModel.Discovery;
namespace WCFDiscovery
{
class Program
{
static void Main(string[] args)
{
try { if (args.Length > 0) StartClient(); else StartServer(); }
catch (Exception ex) { Console.WriteLine(ex); }
finally { Console.WriteLine("press enter to quit..."); Console.ReadLine(); }
}
private static void StartServer()
{
var ipAddress = Dns.GetHostAddresses(Dns.GetHostName()).First(ip => ip.AddressFamily == AddressFamily.InterNetwork);
var address = new Uri(string.Format("net.tcp://{0}:3702", ipAddress));
var host = new ServiceHost(typeof(Service), address);
host.AddServiceEndpoint(typeof(IService), new NetTcpBinding(), address);
host.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
host.AddServiceEndpoint(new UdpDiscoveryEndpoint());
host.Open();
Console.WriteLine("Started on {0}", address);
}
private static void StartClient()
{
var dc = new DiscoveryClient(new UdpDiscoveryEndpoint());
Console.WriteLine("Searching for service...");
var findResponse = dc.Find(new FindCriteria(typeof(IService)));
var response = ChannelFactory<IService>.CreateChannel(new NetTcpBinding(), findResponse.Endpoints[0].Address).Add(1, 2);
Console.WriteLine("Service response: {0}", response);
}
}
[ServiceContract] interface IService { [OperationContract] int Add(int x, int y); }
class Service : IService { public int Add(int x, int y) { return x + y; } }
}
答案 0 :(得分:2)
我在两台不同的机器上运行你的代码(笔记本电脑(Win7)和塔式电脑(Win8),.NET FW 4.5,相同的WiFi网络)并收到以下例外情况:
A remote side security requirement was not fulfilled during authentication. Try increasing the ProtectionLevel and/or ImpersonationLevel.
这是由于服务安全性未得到规定,终端被发现。所以,其他答案的人都是对的 - 这是一个网络问题,无法通过纠正代码来解决。 我想补充说,另一个可能的问题来源可能是网络交换机不允许UDP广播。
答案 1 :(得分:1)
要清楚,Windows防火墙是否也已关闭?
还要确保将服务器绑定到另一台计算机用来与之通信的地址。
Localhost或127.0.0.1可能无法获取与其外部(到主机)可寻址IP的连接,这是多播发现数据包将到达的位置。