Я пишу функцию в С#, используя Azure Functions, и вам нужно получить ip-адрес клиента, который вызвал функцию, возможно ли это?
Как получить IP-адрес клиента в Azure Функции С#?
Ответ 1
Вот ответ, основанный на здесь.
#r "System.Web"
using System.Net;
using System.Web;
public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log)
{
string clientIP = ((HttpContextWrapper)req.Properties["MS_HttpContext"]).Request.UserHostAddress;
return req.CreateResponse(HttpStatusCode.OK, $"The client IP is {clientIP}");
}
Ответ 2
Вы должны использовать эти функции Получить IP-адрес удаленного хоста
request.Properties ["MS_HttpContext"] недоступен, если вы отлаживаете предварительно скомпилированные функции локально request.Properties [RemoteEndpointMessageProperty.Name] недоступно в Azure
private string GetClientIp(HttpRequestMessage request)
{
if (request.Properties.ContainsKey("MS_HttpContext"))
{
return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
}
if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
{
RemoteEndpointMessageProperty prop;
prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
return prop.Address;
}
return null;
}
Обновление 21.08.2018: Теперь функции Azure находятся за LoadBalancer → мы должны проверить заголовки запроса, чтобы определить правильный IP-адрес клиента
private static string GetIpFromRequestHeaders(HttpRequestMessage request)
{
IEnumerable<string> values;
if (request.Headers.TryGetValues("X-Forwarded-For", out values))
{
return values.FirstOrDefault().Split(new char[] { ',' }).FirstOrDefault().Split(new char[] { ':' }).FirstOrDefault();
}
return "";
}
Ответ 3
Теперь, когда функции Azure получают параметр HttpRequest и находятся за балансировщиком нагрузки, эта функция для получения IP-адреса работает для меня:
private static string GetIpFromRequestHeaders(HttpRequest request)
{
return (request.Headers["X-Forwarded-For"].FirstOrDefault() ?? "").Split(new char[] { ':' }).FirstOrDefault();
}
Ответ 4
Обновление 18 октября 2019 года:
Решение, которое я попробовал, намного проще и быстрее и поэтапно упоминается ниже. Но есть несколько более длинных/хитрых альтернатив @https://docs.microsoft.com/en-us/azure/azure-monitor/app/ip-collection:
- Войдите в портал Azure.
- Откройте новую вкладку в том же браузере, когда вы вошли в систему, и наберите 'http://Resources.Azure.Com'
- Это портал служб Azure, поэтому было бы немного осторожно вносить изменения.
- Разверните раздел ПОДПИСКИ на левой панели и разверните свою подписку Azure, в которой расположен ресурс приложения.
- Expand Resource Groups section и expand the Resource Group where app insights resource is.
- Разверните раздел "Группы ресурсов" и раскройте группу "Ресурсы", в которой находится ресурс приложения. Разверните раздел "Поставщики", найдите поставщика Microsoft.Insights и разверните его.
- Разверните раздел "Компоненты", найдите и выберите свой экземпляр App Insight по имени.
- В правом верхнем углу измените свой режим на "Чтение и запись только для чтения".
- Нажмите кнопку EDIT при вызове Rest API.
- ДОБАВИТЬ NEW '"DisableIpMasking": истинное свойство в раздел свойств.
- Нажмите кнопку PUT, чтобы применить изменения.
- Теперь ваш App Insight включен, чтобы начать сбор IP-адресов клиентов.
- Выполните несколько запросов по функции.
- Обновите и протестируйте данные App Insights примерно через 5-10 минут.