WCF 3.0'da istemci IP adresi alma


82

Görünüşe göre WCF 3.5'te kolayca bir istemci IP adresi elde edebilirsiniz, ancak WCF 3.0'da elde edemezsiniz. Nasıl olduğunu bilen var mı?

Yanıtlar:


152

Bu 3.0'da size yardımcı olmuyor, ancak insanların bu soruyu bulduğunu ve 3.5'te istemci IP adresini almaya çalıştıkları için hayal kırıklığına uğradığını görebiliyorum. İşte çalışması gereken bazı kodlar:

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
Gönderiyi düzenleyemedim, ama bana çok yardımcı oldu, teşekkürler! 2 hata olduğunu belirtmek istedim. "OperationContent" yerine "OperationContext" olmalı ve "RemoveEndpointMessageProperty" yerine "RemoteEndpointMessageProperty" olmalıdır.
Jeremy Mullin

3
Güvenlik notu: Bu değer sahte olabilir ... bkz. MSDN
yarım bit,

@ makerofthings7 Bunu MSDN'de görüyorum, ancak gerçekten sahte olabilir mi? İstekte hala bir TCP anlaşması var. IP gerçekten sahte olsaydı, eşzamanlama yanlış yere gönderilmez ve böylece bağlantı başlamadan önce başarısız olur mu?
Maliyet

1
@cost Bu durumda "IP" yalnızca TCP paketinde değil, aynı zamanda WCF mesajında ​​da yerleşiktir, ancak veri akışındaki (Katman 7) bu metin uygun şekilde güvenli değildir '
yarım bit

1
@shambulator Sorunu göreli birkaç yıl oldu, ancak aşağıdaki KB makalesi bunun ipadresleri değil, bağlantı noktaları olabileceğini gösteriyor gibi görünüyor. support.microsoft.com/kb/971842
yarım bit

36

(A) hizmetiniz bir Web Hizmetinde barındırıldığı (açıkça) ve (b) AspNetCompatibility modunu etkinleştirdiğiniz sürece şunları yapabilirsiniz:

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

Ve sonra IP adresini şu şekilde alabilirsiniz:

HttpContext.Current.Request.UserHostAddress

11
Ve sonra bunu kullanarak elde edersinizHttpContext.Current.Request.UserHostAddress
Jader Dias

3
Bunun bir dizi soruna yol
açtığını unutmayın

15

.NET 3.0 SP1'i hedefliyorsanız bunu yapabilirsiniz.

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

Krediler: http://blogs.msdn.com/phenning/archive/2007/08/08/remoteendpointmessageproperty-in-wcf-net-3-5.aspx

Referans: http://msdn.microsoft.com/en-us/library/system.servicemodel.channels.remoteendpointmessageproperty.aspx


3
Tamam, "fe80 :: 3dbc: a2ec" gibi bir IPv6 alıyor gibi görünüyorum. Uzak IP numarasını nasıl alabileceğimi
merak ediyordum

@ makerofthings7 güvenlik kararları verirken ne kullanmalıyız?
CSharper
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.