如何使用服务器端 Blazor 中的 HttpContext 对象检索有关用户、用户代理的信息



IP Address等。通常,当用户询问如何在 Server Blazor 应用中执行此操作时,他们要么被告知这是不可能的,要么有时会提供使用 JSInterop 的部分解决方案。但是,可以在不诉诸JSInterop的情况下完成吗?这是答案...

HttpContext对象不能与 Blazor Server App 一起使用的虚构已经在 Stackoverflow 上传播了很长时间,现在是解决它的时候了。

确实,当 WebSocket 连接正在运行时,HttpContext不可用,但必须明确这一点:键入 URL 并按 Enter 按钮时,与服务器端 Blazor 应用的连接是 HTTP 连接,而不是 WebSocket 连接。

因此,你的应用可以像在 Razor 页面应用或 MVC 应用中一样访问和使用HttpContext,包括获取用户代理和 IP 地址。下面的代码示例演示如何使用HttpContext本机获取用户代理和 IP 地址,而不使用应用作最后手段的JSInterop,并将提取的值传递给App组件。

  1. 将文件添加到Pages文件夹并将其命名为_Host.cshtml.cs
  2. 将此代码添加到文件中:
public class HostModel: PageModel
{
private readonly IHttpContextAccessor _httpContextAccssor;

public HostModel(IHttpContextAccessor httpContextAccssor)
{
_httpContextAccssor = httpContextAccssor;    
}
public string UserAgent { get; set; }
public string IPAddress { get; set; }

// The following links may be useful for getting the IP Adress:
// https://stackoverflow.com/questions/35441521/remoteipaddress-is-always-null
// https://stackoverflow.com/questions/28664686/how-do-i-get-client-ip-address-in-asp-net-core

public void OnGet()
{
UserAgent = _httpContextAccssor.HttpContext.Request.Headers["User-Agent"];
// Note that the RemoteIpAddress property returns an IPAdrress object 
// which you can query to get required information. Here, however, we pass 
// its string representation
IPAddress = _httpContextAccssor.HttpContext.Connection.RemoteIpAddress.ToString();  
}
}

您可能需要以下一种或多种用途:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text.Encodings.Web;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.Http;
  1. 将以下行添加到您的Host.cshthml页面(在靠近用途和该内容的页面顶部(:
@model HostModel
  1. App组件中,定义两个参数属性,这些属性将获取并存储从位于_Host.cshtml中的组件标记传递给它的用户代理和 IP 地址。

应用剃刀:

<p>UserAgent: @UserAgent</p>
<p>IPAddress: @IPAddress</p>
@code
{
[Parameter]
public string UserAgent { get; set; }
[Parameter]
public string IPAddress { get; set; }
}
  1. _Host.cshtml像这样更新组件标签(此方法现已过时(:
<app>
<component type="typeof(App)" render-mode="ServerPrerendered" param-UserAgent="@Model.UserAgent" param-IPAddress="@Model.IPAddress" />
</app>

在当前的 Blazor 服务器端应用中,可以按如下所示完成此操作:

<div>
@(await Html.RenderComponentAsync<App>(RenderMode.Server, new { IPAddress = Model.IPAddress, UserAgent = Model.UserAgent }))
</div>
  1. services.AddHttpContextAccessor();添加到StartupConfigureServices方法中,以启用对HttpContext的访问。

仅此而已。还可以将Identity UI添加到 Blazor Server 应用,并应用上面所示的相同过程在用户进行身份验证后从HttpContext中提取声明主体(执行此操作仅用于学习目的,因为应改用 AuthenticationStateProvider(。

这里还有一个关于当前主题的官方文档的链接。

在启动>配置服务中:

services.AddControllers();

在启动>中配置:

app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
endpoints.MapBlazorHub();
endpoints.MapFallbackToPage("/_Host");
});

添加文件夹名称:控制器

添加一个控制器名称:初始化控制器

添加如下方法:

[Route("[controller]/[action]")]
public class InitController : Controller
{
public IActionResult UserInfo(string redirectUri)
{
var request = Request.HttpContext;

return LocalRedirect(redirectUri);
}
}

在请求变量中,所有数据都存在

最后,为了从页面或组件重定向用户,请使用以下代码:

@inject NavigationManager NavigationManager
@code{
protected override Task OnInitializedAsync ()
{       var uri = new Uri(NavigationManager.Uri)
.GetComponents(UriComponents.PathAndQuery, UriFormat.Unescaped);
var query = $"?redirectUri={Uri.EscapeDataString(uri)}";
NavigationManager.NavigateTo("/Init/UserInfo" + query, forceLoad: true);
StateHasChanged();
return base.OnInitializedAsync();

}
}

最新更新