在DotVVM中获取远程IP地址

时间:2018-05-01 11:14:12

标签: c# asp.net-core dotvvm

我使用AspNet.Core和.NET Framework 4.7.1使用DotVVM框架(版本1.1.9)构建应用程序。 在某些时候,我需要记录远程用户的IP地址。有没有办法让它在ViewModel中?我见过很多教程

ViewModelBase中有一个属性Context,它具有属性HttpContext,但它有一些内置IHttpContext接口,而不是正确的HttpContext

但是我发现我可以将现有的IHttpContext转换为DotvvmHttpContext,其中包含属性OriginalContext,这似乎确实是我正在寻找的属性。

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

所以问题是,如果这是"安全"接近还是其他任何"适当的"如何直接访问原始的AspNet HttpContext或远程IP地址?

2 个答案:

答案 0 :(得分:1)

是的,只要您只在Asp.Net Core上运行应用程序,这是安全的方法。如果您因某种原因切换到OWIN主机,则会抛出无效的强制转换异常。

另请注意,有一个帮助方法可以获取Asp.Net Core http上下文,Context.GetAspNetCoreContext().Connection...可能会更舒服一点。从源代码中可以看出,它与您的代码基本相同:https://github.com/riganti/dotvvm/blob/d623ae5ddf57ecf3617eb68454d546f675b64496/src/DotVVM.Framework.Hosting.AspNetCore/Hosting/AspNetCoreDotvvmRequestContextExtensions.cs#L13

答案 1 :(得分:0)

查看IHttpContext中公开的DotvvmViewModelBase来源,似乎没有一种好方法可以访问连接信息。我希望IHttpRequest可能会公开远程IP地址,但事实并非如此。

您必须依赖从ASP.NET Core访问原始HttpContext才能访问该信息。如果您运行ASP.NET Core(而不是OWIN),那么将上下文强制转换为DotvvmHttpContext以便您可以访问基础HttpContext

所以是的,你的解决方案在这里似乎很好:

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