我使用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地址?
答案 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;