我有一个将在多台服务器上运行的应用程序。它公开了一个 WCF 端点。我希望端点可以同时使用环回和服务器拥有的任何其他 IP(我不想配置每个 IP 地址,特别是因为它们可能会改变)
该应用程序作为 Windows 服务和控制台应用程序运行。我知道我可以使用http://0.0.0.0/<Blah>/
语法绑定到所有地址,但是 wsdl 中的链接等...引用 IP 地址,0.0.0.0
无论请求页面时使用哪个 IP。
有什么方法可以让 WCF 使用所有 IP 并正确响应它们?
这是一个动态绑定到所有可操作 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();
}
}
}
}