0

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

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

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

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

所以问题是,如果这是“安全”方法,还是有任何其他“正确”方法可以直接访问原始 AspNet HttpContext 或远程 IP 地址?

4

2 回答 2

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

于 2018-05-01T18:19:46.847 回答
0

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

您必须依靠在HttpContext此处从 ASP.NET Core 访问原始文件才能访问该信息。如果您在 ASP.NET Core(而不是 OWIN)上运行,则应该完全保存将上下文强制转换为,DotvvmHttpContext以便您可以访问底层的HttpContext.

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

var originalHttpContext = ((DotvvmHttpContext)Context.HttpContext).OriginalContext;
于 2018-05-01T12:10:20.257 回答