Extraindo o IP do cliente

Em algum momento, talvez gostaríamos de extrair o endereço (IP) do cliente que efetuou a requisição para um serviço, com a finalidade de logging, monitoramento, etc. Felizmente há uma possibilidade para resgatar essa informação e, podemos acessá-la durante a execução de uma operação de um serviço exposto via WCF.

Para isso, há uma classe chamada RemoteEndpointMessageProperty que possui duas propriedades: Address e Port. A instancia desta classe é fornecida pelo contexto da requisição, através da coleção IncomingMessageProperties. Para exemplificar o seu uso, veja o código abaixo:

RemoteEndpointMessageProperty cliente =
    OperationContext.Current.IncomingMessageProperties[RemoteEndpointMessageProperty.Name]
        as RemoteEndpointMessageProperty;

Console.WriteLine(“{0}:{1}”, cliente.Address, cliente.Port);

Como especificado na documentação, essas informações só estarão disponíveis quando o serviço estiver exposto através do protocolo HTTP ou TCP. Além disso, quando a requisição já foi efetuada (como é o caso de operações one-way), essas informações estarão indisponíveis. E, para finalizar, se a requisição passar por intermediários (roteadores), o endereço/porta irá refletir o endereço/porta do último intermediário.

ClearUserNameBinding

Recentemente, falei aqui sobre a necessidade de utilizar certificados quando queremos utilizar o formato UserName como meio de autenticação em serviços WCF. O Yaron Naveh criou um binding que altera este comportamento, permitindo que essas informações sejam trafegadas sem nenhuma espécie de segurança.