Я пытаюсь определить IP-адрес клиента по следующей ссылке: http://www.danrigsby.com/blog/index.php/2008/05/21 / get-the-client-address-in-wcf /
В .Net 3. клиент подключается к сервису WCF. В .Net 3.5 новое свойство было представил называется RemoteEndpointMessageProperty. Это свойство дает вы IP-адрес и порт, что клиентское соединение вошло в сервис на. Получить эту информацию довольно просто. Просто вытяните его из свойства IncomingMessageProperties текущего OperationContext с помощью RemoteEndpointMessageProperty.Name и доступа Свойства адреса и порта.
> [ServiceContract] public interface IMyService {
> [OperationContract]
> string GetAddressAsString(); }
>
> public class MyService : IMyService {
> public string GetAddressAsString()
> {
> RemoteEndpointMessageProperty clientEndpoint =
> OperationContext.Current.IncomingMessageProperties[
> RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
>
> return String.Format(
> "{0}:{1}",
> clientEndpoint.Address, clientEndpoint.Port);
> } }
Следует отметить:
- Это свойство работает только для транспортов http и tcp. На все остальные транспорты, такие как MSMQ и NamedPipes, это свойство не будет доступный.
- Адрес и порт сообщаются сокетом или http.sys. машины службы. Так что, если клиент пришел через VPN или какой-то другой прокси, который изменил адрес, этот новый адрес будет представляется вместо локального адреса клиента. Это желательно и важно, потому что это адрес и порт, который служба видит клиента как, а не как видит себя клиент. Это также означает что там может быть какая-то подделка. Клиент или что-то в между клиентом и сервером может подделать адрес. Итак, не используйте адрес или порт для любых решений безопасности, если вы не добавите в некоторые другие таможенные механизмы проверки.
- Если вы используете дуплекс на вашем сервис, то не только сервис будет заполнять это свойство для клиента, но у клиента также будет заполнено это свойство для службы для каждого вызова из этой службы.
У меня есть операции Контракты WebInvoke / Post и WebGet. Код работает, когда клиентский запрос является WebGet. Но когда клиентский запрос является WebInvoke, я получу IP-адрес хоста WCF. Любое решение? Спасибо.
Вот интерфейс
[OperationContract]
[WebGet(UriTemplate = RestTemplate.hello_get)]
Stream hello_get();
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = RestTemplate.hello_post)]
Stream hello_post();
// Code for getting IP
private string getClientIP()
{
//WebOperationContext webContext = WebOperationContext.Current;
OperationContext context = OperationContext.Current;
MessageProperties messageProperties = context.IncomingMessageProperties;
RemoteEndpointMessageProperty endpointProperty =
messageProperties[RemoteEndpointMessageProperty.Name]
as RemoteEndpointMessageProperty;
return endpointProperty.Address;
}
public Stream hello_get()
{
string ip = getClientIP();
...
}
public Stream hello_post()
{
string ip = getClientIP();
...
}