В ASP.NET есть System.Web.HttpRequest
класс, который содержит ServerVariables
свойство, которое может предоставить нам IP-адрес из REMOTE_ADDR
значения свойства.
Однако я не смог найти аналогичный способ получения IP-адреса удаленного хоста из ASP.NET Web API.
Как я могу получить IP-адрес удаленного хоста, который делает запрос?
c#
asp.net-web-api
paulius_l
источник
источник
RemoteEndpointMessageProperty
класс вSystem.ServiceModel.Channels
пространстве имен,System.ServiceModel.dll
сборка? Разве это не собрание, принадлежащее WCF?Это решение также охватывает веб-API, размещенный самостоятельно с помощью Owin. Частично отсюда .
Вы можете создать частный метод,
ApiController
который будет возвращать удаленный IP-адрес независимо от того, как вы размещаете свой веб-API:Требуются ссылки:
HttpContextWrapper
- System.Web.dllRemoteEndpointMessageProperty
- System.ServiceModel.dllOwinContext
- Microsoft.Owin.dll (он будет уже у вас, если вы используете пакет Owin)Небольшая проблема с этим решением состоит в том, что вам нужно загружать библиотеки для всех 3 случаев, когда вы фактически будете использовать только один из них во время выполнения. Как предлагается здесь , это может быть преодолено с помощью
dynamic
переменных. Вы также можете написатьGetClientIpAddress
метод как расширение дляHttpRequestMethod
.Теперь вы можете использовать это так:
источник
using System.Net.Http;
строка, потому что вы расширяетеHttpRequestMessage
. Если только вы не определяете свое расширение вSystem.Net.Http
пространстве имен, что очень сомнительно. Не уверен, что это важно, потому что он будет автоматически добавлен любым IDE или инструментом повышения производительности. Что вы думаете?Если вы действительно хотите использовать одну строку и не планируете самостоятельно размещать веб-API:
источник
Приведенные выше ответы требуют ссылки на System.Web для приведения свойства к HttpContext или HttpContextWrapper. Если вы не хотите ссылку, вы можете получить IP с помощью динамического:
источник
Решение, предоставленное carlosfigueira, работает, но безопасные однострочники лучше: добавьте
using System.Web
затем доступHttpContext.Current.Request.UserHostAddress
в свой метод действия.источник
HttpContext.Current
он не сохраняется корректно в конвейере задач; так как вся обработка запросов асинхронная.HttpContext.Current
почти всегда следует избегать при написании кода веб-API.SynchronizationContext
поток правильно передается между задачами); самая большая проблема в этом случае, если ваш сервисный код, вероятно, когда-либо будет размещаться самостоятельно (например, для тестирования) -HttpContext.Current
это чисто Asp.Net-конструкция, которая не существует, когда вы размещаетесь самостоятельно.NullReferenceException
создает сложность для отладки, если используется из потока (например, ожидающий задачи, очень распространенный в современном коде Web API) или в автономном контексте. По крайней мере, большинство других ответов просто вернутсяnull
.