Получить удаленный IP-адрес в DotVVM

Я создаю приложение, используя платформу DotVVM (версия 1.1.9), используя AspNet.Core и .NET Framework 4.7.1. В какой-то момент мне нужно зарегистрировать IP-адрес удаленного пользователя. Есть ли способ поместить это в ViewModel? Я видел много руководств

В ViewModelBase есть свойство Context, у которого есть свойство HttpContext, но это какой-то встроенный интерфейс IHttpContext, а не правильный HttpContext.

Однако я обнаружил, что могу преобразовать существующий IHttpContext в DotvvmHttpContext, который содержит свойство OriginalContext, которое действительно кажется тем, что я искал.

var remoteAddr = ((DotvvmHttpContext)Context.HttpContext).OriginalContext.Connection.RemoteIpAddress;

Итак, вопрос в том, является ли это «безопасным» подходом или есть какой-либо другой «правильный» способ прямого доступа к исходному AspNet HttpContext или удаленному IP-адресу?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
139
2

Ответы 2

Глядя на источник для IHttpContext, который представлен в DotvvmViewModelBase, кажется, что нет хорошего способа получить доступ к информации о соединении. Я надеялся, что IHttpRequest может раскрыть удаленный IP-адрес, но это тоже не так.

Вы должны полагаться на доступ к исходному HttpContext из ASP.NET Core здесь, чтобы получить доступ к этой информации. Если вы работаете в ASP.NET Core (вместо OWIN), то его следует полностью сохранить, чтобы привести контекст к DotvvmHttpContext, чтобы вы могли получить доступ к базовому HttpContext.

Так что да, ваше решение кажется здесь прекрасным:

var originalHttpContext = ((DotvvmHttpContext)Context.HttpContext).OriginalContext;

Да, это безопасный подход, если вы собираетесь запускать приложение только на Asp.Net Core. Если вы по какой-то причине переключитесь на хостинг OWIN, это вызовет недопустимое исключение приведения.

Также обратите внимание, что существует вспомогательный метод для получения http-контекста Asp.Net Core, Context.GetAspNetCoreContext().Connection... может быть немного более удобным. Как видно из исходного кода, он в основном такой же, как и ваш код: https://github.com/riganti/dotvvm/blob/d623ae5ddf57ecf3617eb68454d546f675b64496/src/DotVVM.Framework.Hosting.AspNetCore/Hosting/AspNetCoreDotvvmRequestContextLextensions

Другие вопросы по теме