Sou totalmente novo na pilha do ASP.NET MVC e queria saber o que aconteceu com o simples objeto Page e o objeto Request ServerVariables?
Basicamente, quero extrair o endereço IP do PC cliente, mas não consigo entender como a estrutura atual do MVC mudou tudo isso.
Pelo que entendi, a maioria dos objetos variáveis foi substituída pelas variantes HttpRequest .
Alguém gostaria de compartilhar alguns recursos? Existe realmente um monte de coisas para aprender no mundo do ASP.NET MVC. :)
Por exemplo, eu tenho uma classe estática com esta função atual. Como obtenho o mesmo resultado usando o ASP.NET MVC?
public static int getCountry(Page page)
{
return getCountryFromIP(getIPAddress(page));
}
public static string getIPAddress(Page page)
{
string szRemoteAddr = page.Request.ServerVariables["REMOTE_ADDR"];
string szXForwardedFor = page.Request.ServerVariables["X_FORWARDED_FOR"];
string szIP = "";
if (szXForwardedFor == null)
{
szIP = szRemoteAddr;
}
else
{
szIP = szXForwardedFor;
if (szIP.IndexOf(",") > 0)
{
string [] arIPs = szIP.Split(',');
foreach (string item in arIPs)
{
if (!isPrivateIP(item))
{
return item;
}
}
}
}
return szIP;
}
E como eu chamo essa função na página do controlador?
c#
asp.net-mvc
Melaos
fonte
fonte
Respostas:
A resposta simples é usar a propriedade HttpRequest.UserHostAddress .
Exemplo: De dentro de um controlador:
Exemplo: De dentro de uma classe auxiliar:
MAS, se a solicitação tiver sido transmitida por um ou mais servidores proxy , o endereço IP retornado pela propriedade HttpRequest.UserHostAddress será o endereço IP do último servidor proxy que retransmitiu a solicitação.
Servidores proxy PODEM usar o padrão de fato de colocar o endereço IP do cliente no cabeçalho X-Forwarded-For HTTP. Além de não haver garantia de que uma solicitação tenha um cabeçalho X-Forwarded-For, também não há garantia de que o X-Forwarded-For não tenha sido SPOOFED .
Resposta original
O código acima fornece o endereço IP do cliente sem recorrer a procurar uma coleção. A propriedade Request está disponível em Controllers (ou Views). Portanto, em vez de passar uma classe Page para sua função, você pode passar um objeto Request para obter o mesmo resultado:
fonte
Request.ServerVariables["REMOTE_ADDR"]
deve funcionar - diretamente em uma exibição ou no corpo do método de ação do controlador (Request é uma propriedade da classe Controller no MVC, não Page).Está funcionando .. mas você deve publicar em um IIS real, não no virtual.
fonte
Muito do código aqui foi muito útil, mas eu o limpei para meus propósitos e adicionei alguns testes. Aqui está o que eu acabei com:
E aqui estão alguns testes do NUnit contra esse código (estou usando o Rhino Mocks para zombar do HttpRequestBase, que é a chamada M <HttpRequestBase> abaixo):
fonte
publicForwardingIps.First()
?Ocorreu um problema ao usar o descrito acima e precisava do endereço IP de um controlador. Eu usei o seguinte no final:
fonte
HttpContext.Request.UserHostAddress
Em uma classe, você pode chamar assim:
Eu usei isso em um aplicativo de barbear com ótimos resultados.
fonte
Como eu considero meu site protegido por um Amazon AWS Elastic Load Balancer (ELB):
fonte