首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Blazor中获取客户端IP和浏览器信息?

如何在Blazor中获取客户端IP和浏览器信息?
EN

Stack Overflow用户
提问于 2019-09-17 21:43:14
回答 4查看 17.6K关注 0票数 16

如何在Blazor服务器端获取客户端信息,如IP adress和浏览器名称/版本?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-29 15:25:21

请注意,这只是指服务器端的Blazor

“目前还没有一个很好的方法可以做到这一点。我们将研究如何向客户提供这些信息。”

来源:巴兹尔·德夫在吉顿

解决办法

客户端对服务器进行ajax调用,然后服务器可以获取本地ip号。Javascript:

代码语言:javascript
复制
window.GetIP = function () {
    var token = $('input[name="__RequestVerificationToken"]').val();
    var myData = {}; //if you want to post extra data
    var dataWithAntiforgeryToken = $.extend(myData, { '__RequestVerificationToken': token });
    var ip = String('');
    $.ajax({
        async: !1, //async works as well 
        url: "/api/sampledata/getip",
        type: "POST",
        data: dataWithAntiforgeryToken,
        success: function (data) {
            ip = data;
            console.log('Got IP: ' + ip);
        },
        error: function () {
            console.log('Failed to get IP!');
        }
    });
    return ip;
};

后端(ASP.NET Core3.0):

代码语言:javascript
复制
    [HttpPost("[action]")]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public string GetIP()
    {
        return HttpContext.Connection.RemoteIpAddress?.ToString();
    }

请注意,这是不安全的,ipnumber可能会被欺骗,所以不要用于任何重要的事情。

票数 2
EN

Stack Overflow用户

发布于 2019-12-19 22:48:42

嗯,今天早上我遇到了这个问题,我解决服务器端Razor问题的方法是创建一个类,然后您可以在_host.cshtml上注入一个作用域服务,然后访问Razor组件上的任何位置,因为Razor页面已经支持这个功能。

代码语言:javascript
复制
    public class BlazorAppContext
    {
        /// <summary>
        /// The IP for the current session
        /// </summary>
        public string CurrentUserIP { get; set; }
    }

Startup.cs:

代码语言:javascript
复制
    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
      ...

      services.AddScoped<BlazorAppContext>();

      ...
    }

_host.cshtml:

代码语言:javascript
复制
@inject IHttpContextAccessor httpContextAccessor
@{
    BlazorAppContext.CurrentUserIP =   httpContextAccessor.HttpContext.Connection?.RemoteIpAddress.ToString();
}

您还可以尝试一种范围方法,然后可以通过DI使用该方法。

注释:

正如文档中所述,"Blazor WebAssembly应用程序目前没有DI作用域的概念。范围注册的服务行为类似于Singleton服务。然而,Blazor Server宿主模型支持作用域生存期。在Blazor Server应用程序中,范围服务注册的作用域是连接。因此,对于应该对当前用户限定作用域的服务,使用作用域服务是首选的,即使当前的意图是在浏览器中运行客户端。“

希望能帮上忙。

票数 11
EN

Stack Overflow用户

发布于 2020-07-22 09:03:48

在aspnetcore3.1中,这适用于我:

  1. 为保存所需信息设置特殊类别:
代码语言:javascript
复制
public class ConnectionInfo
{
    public string RemoteIpAddress { get; set; } = "-none-";
}
  1. _Host.cshtml中创建实例并作为参数传递给App组件:
代码语言:javascript
复制
@{
    var connectionInfo = new ConnectionInfo() 
    { 
        RemoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress.ToString() 
    };
}
...
<component type="typeof(App)" 
           render-mode="ServerPrerendered"
           param-ConnectionInfo="connectionInfo" />
  1. App.razor中捕获并重新发布为CascadingValue
代码语言:javascript
复制
<CascadingValue Value="connectionInfo">
  <Router AppAssembly="typeof(Program).Assembly">
      ...
  </Router>
</CascadingValue>

@code {
    [Parameter]
    public ConnectionInfo? connectionInfo { get; set; }
}
  1. 在任何子页面/组件中作为CascadingParameter获取
代码语言:javascript
复制
@code {
    [CascadingParameter]
    private ConnectionInfo? connectionInfo { get; set; }
}

这里唯一的问题是漫游用户--当用户更改他的IP地址时,Blazor没有“捕获”这个地址(例如,后台的浏览器选项卡),在用户刷新(F5)页面之前,您将有旧的IP地址。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57982444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档