我遇到了一个问题。我在 WCF 有点新,所以任何帮助都会非常感激。
这是我的代码:
public static void StartHosts()
{
try
{
// Create a new host
ServiceHost host = new ServiceHost(typeof(ServerTasks));
List<IPAddress> ips = new List<IPAddress>(Dns.GetHostAddresses(Dns.GetHostName()));
if (IPAddress.Loopback != null)
ips.Add(IPAddress.Loopback);
ips.RemoveAll(i => i.AddressFamily != AddressFamily.InterNetwork);
foreach (var ip in ips)
{
string uri = string.Empty;
// Formulate the uri for this host
uri = string.Format(
"net.tcp://{0}:{1}/ServerTasks",
ip.ToString(),
ServerSettings.Instance.TCPListeningPort
);
// Add the endpoint binding
host.AddServiceEndpoint(
typeof(ServerTasks),
new NetTcpBinding(SecurityMode.Transport) { TransferMode = TransferMode.Streamed },
uri
);
}
// Add the meta data publishing
var smb = host.Description.Behaviors.Find<ServiceMetadataBehavior>();
if (smb == null)
smb = new ServiceMetadataBehavior();
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
host.Description.Behaviors.Add(smb);
host.AddServiceEndpoint(
ServiceMetadataBehavior.MexContractName,
MetadataExchangeBindings.CreateMexTcpBinding(),
"net.tcp://localhost/ServerTasks/mex"
);
// Run the host
host.Open();
}
catch (Exception exc)
{
DebugLogger.WriteException(exc);
}
}
在线抛出异常:'host.Open();'
例外是:
System.InvalidOperationException URI 'net.tcp://192.168.1.45:4329/ServerTasks' 的注册已经存在。
我要做的是绑定到机器上的所有网络地址,以便客户端应用程序可以从他们看到的任何网络访问服务。当我运行此代码时,它会找到并尝试为大约 5 个不同的 IP(包括 127.0.0.1)设置绑定。
192.168.1.45 是它尝试绑定的第二个 IP。在它引发异常时,我可以看到(使用 netstat)程序已绑定到端口 4329 上列表中的第一个 IP。异常中提到的地址上没有任何绑定到端口 4329 的内容。
抱歉,没有太多细节,我想写一个简洁的帖子。如果有人需要更多信息,我很乐意提供。
注意:对于在 foreach 循环中创建的 NetTcpBinding,我尝试将 PortSharingEnabled 设置为 true,但我仍然遇到相同的错误。
任何帮助或建议将不胜感激!
谢谢