No ASP.NET, há uma System.Web.HttpRequest
classe que contém ServerVariables
propriedades que podem nos fornecer o endereço IP do REMOTE_ADDR
valor da propriedade.
No entanto, não foi possível encontrar uma maneira semelhante de obter o endereço IP do host remoto da API da Web do ASP.NET.
Como posso obter o endereço IP do host remoto que está fazendo a solicitação?
c#
asp.net-web-api
paulius_l
fonte
fonte
RemoteEndpointMessageProperty
classe está noSystem.ServiceModel.Channels
namespaceSystem.ServiceModel.dll
assembly? Não é uma montagem pertencente ao WCF?Esta solução também abrange a API da Web auto-hospedada usando Owin. Parcialmente daqui .
Você pode criar um método privado
ApiController
que retornará o endereço IP remoto, independentemente de como você hospeda sua API da Web:Referências necessárias:
HttpContextWrapper
- System.Web.dllRemoteEndpointMessageProperty
- System.ServiceModel.dllOwinContext
- Microsoft.Owin.dll (você já o terá se usar o pacote Owin)Um pequeno problema com esta solução é que você precisa carregar bibliotecas para todos os 3 casos em que estará usando apenas uma delas durante o tempo de execução. Como sugerido aqui , isso pode ser superado usando
dynamic
variáveis. Você também pode escrever oGetClientIpAddress
método como uma extensão paraHttpRequestMethod
.Agora você pode usá-lo assim:
fonte
using System.Net.Http;
linha porque está se estendendoHttpRequestMessage
. A menos que você esteja definindo sua extensão noSystem.Net.Http
namespace, isso é muito questionável. No entanto, não tenho certeza de que seja essencial, porque será automaticamente adicionado por qualquer IDE ou ferramenta de produtividade. O que você acha?Se você realmente deseja uma linha e não planeja hospedar a API da Web:
fonte
As respostas acima exigem uma referência ao System.Web para converter a propriedade em HttpContext ou HttpContextWrapper. Se você não quiser a referência, poderá obter o ip usando uma dinâmica:
fonte
A solução fornecida pela carlosfigueira funciona, mas as one-liners seguras para o tipo são melhores: adicione um
using System.Web
acessoHttpContext.Current.Request.UserHostAddress
ao seu método de ação.fonte
HttpContext.Current
não persiste corretamente em todo o pipeline de tarefas; pois todo o processamento de solicitações é assíncrono.HttpContext.Current
quase sempre deve ser evitado ao escrever o código da API da Web.SynchronizationContext
fluxo for correto entre as tarefas); o maior problema com isso é se o seu código de serviço provavelmente será auto-hospedado (teste, por exemplo) -HttpContext.Current
é uma construção puramente do Asp.Net e não existe quando você é auto-hospedado.NullReferenceException
se usado em um encadeamento (por exemplo, um garçom de tarefas, muito comum no código moderno da API da Web) ou em um contexto auto-hospedado. Pelo menos a maioria das outras respostas retornaránull
.