Я создаю приложение, используя платформу 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-адресу?
Глядя на источник для 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