Получить удаленный IP-адрес в DotVVM - PullRequest
0 голосов
/ 01 мая 2018

Я создаю приложение, используя DotVVM Framework (версия 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;

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

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

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

0 голосов
/ 01 мая 2018

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

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

Так что, да, ваше решение кажется вполне подходящим:

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