【问题标题】:Get remote IP address in DotVVM在 DotVVM 中获取远程 IP 地址
【发布时间】:2018-10-11 10:24:33
【问题描述】:

我正在使用 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 地址?

【问题讨论】:

    标签: c# asp.net-core dotvvm


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      是的,您的解决方案在这里看起来很好:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-05
        • 1970-01-01
        • 2020-11-29
        • 2019-04-12
        • 1970-01-01
        • 2012-03-01
        • 2012-03-22
        • 2011-06-13
        相关资源
        最近更新 更多