2008-12-24 11 views
24

Có cách nào để nhận địa chỉ IP từ xa của kết nối WCF không?Cách lấy địa chỉ IP của điểm cuối từ xa WCF?

Tôi đoán lý do tại sao nó không được xây dựng trong khuôn khổ WCF là WCF có thể làm việc với các ràng buộc không TCP/IP, vì vậy địa chỉ IP không phải lúc nào cũng có ý nghĩa.

Tuy nhiên, thông tin sẽ có ý nghĩa đối với tất cả các ràng buộc được sử dụng rộng rãi (Theo như tôi biết: BasicHttp, DualHttp, WSHttp và NetTcp).

Địa chỉ IP có thể truy cập được bằng cách sử dụng sự phản chiếu, nhưng tôi muốn tìm một cách được tài liệu để có được nó thay vì xâm nhập vào các lớp khung công tác.

Tôi đã giải quyết vấn đề và có vẻ như rất nhiều người đã gặp phải sự cố mà không tìm được giải pháp hợp lý (Câu trả lời thông thường là to rely on the message headers, nhưng điều này ngụ ý tin tưởng khách hàng cung cấp địa chỉ IP thực của nó không phải là tùy chọn nếu bạn muốn đăng nhập Địa chỉ IP vì lý do bảo mật)

Trả lời

14

Dường như nó đã được thêm vào 3,5 qua RemoteEndpointMessageProperty; xem here.

+0

bài đăng cho biết điều này có thể bị giả mạo, nhưng tôi không thể tìm hiểu xem họ đang nói về giả mạo IP cổ điển (sử dụng đồng bộ/acks) hay nếu chúng có nghĩa là thông tin được cung cấp bởi ứng dụng wcf từ xa. Tôi nghĩ rằng nó là khá cũ vì địa chỉ chúng tôi nhận được là địa chỉ proxy/relay. Bất kỳ gợi ý về điều này? – Brann

+0

Xin lỗi, tôi không biết. –

+0

Ví dụ này tạo IP theo định dạng IPv6 - bất kỳ ai biết cách chuyển đổi IP sang địa chỉ IPv4? – user141682

2

nếu bạn đang ở phía dịch vụ và muốn nhận IP khách hàng, bạn phải kiểm tra Thuộc tính thư của OperationContext. xem here hoặc h ere ví dụ

+0

Nếu tôi không nhầm, điều này ngụ ý tin tưởng Client (xem phần cuối của bài đăng được liên kết đầu tiên), hãy cẩn thận khi sử dụng IP cho mọi loại ") Tôi muốn truy cập ổ cắm của chính mình và truy xuất địa chỉ IP được kết nối. – Brann

3
OperationContext context = OperationContext.Current; 
MessageProperties properties = context.IncomingMessageProperties; 
RemoteEndpointMessageProperty endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty; 
string address = endpoint.Address; 
+1

Ví dụ này là ví dụ phù hợp nhất với tôi. Cảm ơn. –