Lấy địa chỉ IP máy khách trong WCF 3.0


82

Rõ ràng bạn có thể dễ dàng lấy được địa chỉ IP máy khách trong WCF 3.5 nhưng không phải trong WCF 3.0. Có ai biết làm thế nào không?

Câu trả lời:


152

Điều này không giúp bạn trong 3.0, nhưng tôi có thể thấy mọi người tìm thấy câu hỏi này và thất vọng vì họ đang cố lấy địa chỉ IP của máy khách trong 3.5. Vì vậy, đây là một số mã sẽ hoạt động:

using System.ServiceModel;
using System.ServiceModel.Channels;

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint =
    prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;

11
Tôi không thể chỉnh sửa bài đăng, nhưng nó đã giúp tôi rất nhiều, cảm ơn! Muốn đề cập đến có 2 lỗi. Phải là "OperationContext" thay vì "OperationContent" và phải là "RemoteEndpointMessageProperty" thay vì "RemoveEndpointMessageProperty".
Jeremy Mullin 14/10/09

3
Lưu ý bảo mật: Giá trị này có thể bị giả mạo ... xem MSDN
goodguys_activate

@ makerofthings7 Tôi thấy điều đó trên MSDN, nhưng nó thực sự có thể bị giả mạo? Yêu cầu vẫn có sự bắt tay TCP. Nếu IP thực sự bị giả mạo, liệu hệ thống ack có bị gửi đến sai nơi và do đó kết nối sẽ bị lỗi trước khi nó bắt đầu?
giá

1
@cost "IP" trong trường hợp này không chỉ nằm trong gói TCP mà còn nằm trong thông báo WCF, tuy nhiên văn bản này trong luồng dữ liệu (Lớp 7) không được bảo mật đúng cách '
goodguys_activate

1
@shambulator Đã vài năm kể từ khi tôi gặp sự cố, nhưng bài viết KB sau đây dường như chỉ ra rằng nó có thể là cổng chứ không phải địa chỉ ipad. support.microsoft.com/kb/971842
goodguys_activate

36

Hóa ra là bạn có thể, miễn là (a) dịch vụ của bạn đang được lưu trữ trong một Dịch vụ Web (hiển nhiên) và (b) bạn bật chế độ Tương thích AspNetC, như sau:

    <system.serviceModel>
            <!-- this enables WCF services to access ASP.Net http context -->
            <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
...
    </system.serviceModel>

Và sau đó bạn có thể lấy địa chỉ IP bằng cách:

HttpContext.Current.Request.UserHostAddress

11
Và sau đó bạn nhận được nó bằng cách sử dụngHttpContext.Current.Request.UserHostAddress
Jader Dias

3
Được cảnh báo Kéo này trong một tập hợp toàn bộ các vấn đề
user1496062

15

Bạn có thể nếu bạn đang nhắm mục tiêu .NET 3.0 SP1.

OperationContext context = OperationContext.Current;
MessageProperties prop = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpoint = prop[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
string ip = endpoint.Address;

Tín dụng: http://blogs.msdn.com/phenning/archive/2007/08/08/remoteendpointmessageproperty-in-wcf-net-3-5.aspx

Tham khảo: http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.remoteendpointmessageproperty.aspx


3
Được rồi, tôi có vẻ như nhận được một IPv6 như "fe80 :: 3dbc: a2ec". Tôi đã lang thang làm thế nào tôi có thể nhận được số IP từ xa
Junior Mayhé

@ makerofthings7 chúng ta nên sử dụng gì khi đưa ra quyết định bảo mật?
CSharper
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.