我有一个将在多台服务器上运行的应用程序。它公开了WCF端点。我希望端点可以使用环回和服务器拥有的任何其他IP(我不想配置每个端口的IP地址,特别是因为它们可能会发生变化)
该应用程序同时作为Windows服务和控制台应用程序运行。我知道我可以使用http://0.0.0.0/<Blah>/
语法绑定到所有地址,但是wsdl中的链接等...无论在请求页面时使用了哪个IP,都会引用IP地址0.0.0.0
。
有什么方法可以让WCF使用所有IP并对它们做出正确回应?
答案 0 :(得分:1)
这是一个动态绑定到所有可操作的IPV4套接字的示例。当然,您仍然需要跟踪绑定到的地址和端口,并将它们报告给实现GetKnownNodes()函数的任何服务。请注意,我正在更改端口以避免与环回地址和外部IP冲突。当然,这可以用不同的方式处理。
using System;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using System.ServiceModel;
namespace Stackoverflow11750995
{
[ServiceContract]
public interface ITimeService
{
[OperationContract]
string TimeAsString();
}
public class TimeService : ITimeService
{
public string TimeAsString()
{
return string.Format("The time is {0:f}", DateTime.Now);
}
}
class Program
{
static void Main(string[] args)
{
using (var host = new ServiceHost(typeof(Stackoverflow11750995.TimeService)))
{
int port = 12345;
foreach (var adpt in NetworkInterface.GetAllNetworkInterfaces())
{
if (adpt.OperationalStatus == OperationalStatus.Up)
{
foreach (var addr in adpt.GetIPProperties().UnicastAddresses)
{
if (addr.Address.AddressFamily == AddressFamily.InterNetwork)
{
string uri = string.Format("net.tcp://{0}:{1}/Service", addr.Address, port++);
host.AddServiceEndpoint(typeof(ITimeService), new NetTcpBinding(), uri);
}
}
}
}
host.Open();
Console.WriteLine("Press any key to exit");
Console.ReadKey();
}
}
}
}