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.
Muito bom o seu artigo. Porém, eu recebo exception. Verifiquei com o breakpoint e o problema é que o contexto vem nulo. Meu wcf está fazendo binding para webservice. Existe alguma configuração que eu possa ter feito errado ou como posso fazer para solucionar este problema?
Boas Mauricio,
E qual tipo de mensagem está utilizando? One-way?