如何在Blazor服务器端获取客户端信息,如IP adress和浏览器名称/版本?
发布于 2019-10-29 15:25:21
请注意,这只是指服务器端的Blazor。
“目前还没有一个很好的方法可以做到这一点。我们将研究如何向客户提供这些信息。”
来源:巴兹尔·德夫在吉顿
解决办法
客户端对服务器进行ajax调用,然后服务器可以获取本地ip号。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):
[HttpPost("[action]")]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public string GetIP()
{
return HttpContext.Connection.RemoteIpAddress?.ToString();
}
请注意,这是不安全的,ipnumber可能会被欺骗,所以不要用于任何重要的事情。
发布于 2019-12-19 22:48:42
嗯,今天早上我遇到了这个问题,我解决服务器端Razor问题的方法是创建一个类,然后您可以在_host.cshtml上注入一个作用域服务,然后访问Razor组件上的任何位置,因为Razor页面已经支持这个功能。
public class BlazorAppContext
{
/// <summary>
/// The IP for the current session
/// </summary>
public string CurrentUserIP { get; set; }
}
Startup.cs:
// 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:
@inject IHttpContextAccessor httpContextAccessor
@{
BlazorAppContext.CurrentUserIP = httpContextAccessor.HttpContext.Connection?.RemoteIpAddress.ToString();
}
您还可以尝试一种范围方法,然后可以通过DI使用该方法。
注释:
正如文档中所述,"Blazor WebAssembly应用程序目前没有DI作用域的概念。范围注册的服务行为类似于Singleton服务。然而,Blazor Server宿主模型支持作用域生存期。在Blazor Server应用程序中,范围服务注册的作用域是连接。因此,对于应该对当前用户限定作用域的服务,使用作用域服务是首选的,即使当前的意图是在浏览器中运行客户端。“
希望能帮上忙。
发布于 2020-07-22 09:03:48
在aspnetcore3.1中,这适用于我:
public class ConnectionInfo
{
public string RemoteIpAddress { get; set; } = "-none-";
}
_Host.cshtml
中创建实例并作为参数传递给App
组件:@{
var connectionInfo = new ConnectionInfo()
{
RemoteIpAddress = Request.HttpContext.Connection.RemoteIpAddress.ToString()
};
}
...
<component type="typeof(App)"
render-mode="ServerPrerendered"
param-ConnectionInfo="connectionInfo" />
App.razor
中捕获并重新发布为CascadingValue
。<CascadingValue Value="connectionInfo">
<Router AppAssembly="typeof(Program).Assembly">
...
</Router>
</CascadingValue>
@code {
[Parameter]
public ConnectionInfo? connectionInfo { get; set; }
}
CascadingParameter
获取@code {
[CascadingParameter]
private ConnectionInfo? connectionInfo { get; set; }
}
这里唯一的问题是漫游用户--当用户更改他的IP地址时,Blazor没有“捕获”这个地址(例如,后台的浏览器选项卡),在用户刷新(F5)页面之前,您将有旧的IP地址。
https://stackoverflow.com/questions/57982444
复制相似问题