Tôi đã gặp sự cố. Tôi là một chút mới tại WCF vì vậy bất kỳ trợ giúp sẽ được rất nhiều appreaciated.WCF: Net.TCP nhiều ràng buộc, cùng một cổng, Địa chỉ IP khác nhau
Dưới đây là mã của tôi:
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);
}
}
Một ngoại lệ được ném vào dòng: 'host.Open();'
Trường hợp ngoại lệ là:
System.InvalidOperationException Một đăng ký đã tồn tại cho URI 'net.tcp: //192.168.1.45: 4329/ServerTasks'.
Điều tôi đang cố gắng thực hiện là liên kết với tất cả các địa chỉ mạng trên máy để ứng dụng khách có thể tiếp cận dịch vụ từ bất kỳ mạng nào họ nhìn thấy trên đó. Khi tôi chạy mã này, nó tìm và cố gắng thiết lập một ràng buộc cho khoảng 5 IP khác nhau, bao gồm 127.0.0.1.
192.168.1.45 là IP thứ hai mà nó cố gắng liên kết. Tại thời điểm mà nó ném ngoại lệ tôi có thể thấy (sử dụng netstat) rằng chương trình đã ràng buộc với IP đầu tiên trong danh sách trên cổng 4329. Không có bất kỳ điều gì ràng buộc với cổng 4329 trên địa chỉ được đề cập trong ngoại lệ.
Rất tiếc, không có nhiều chi tiết, tôi muốn đưa ra một bài đăng súc tích. Nếu có ai cần thêm thông tin, tôi sẽ vui lòng cung cấp nó.
Lưu ý: Tôi đã thử đặt PortSharingEnabled thành true cho NetTcpBinding được tạo bên trong vòng lặp foreach, nhưng tôi vẫn gặp phải lỗi tương tự.
Bất kỳ trợ giúp hoặc tư vấn nào sẽ được đánh giá rất cao!
Cảm ơn
Ràng buộc với từng địa chỉ IP riêng là điều đúng để làm vì nếu không máy chủ của bạn có lỗ hổng bảo mật - tưởng tượng (không xảy ra) khi dịch vụ khác liên kết chính nó với địa chỉ IP máy chủ cụ thể và cùng một cổng trong khi dịch vụ của bạn bị ràng buộc với tất cả địa chỉ IP . Trong trường hợp này, imposter sẽ nhận được tất cả các yêu cầu kết nối từ các máy khách đến địa chỉ IP này. – AlexT