gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:34:21 37 4
gpt4 key购买 nike

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

最佳答案

HttpContext的小说object 不能与 Blazor Server App 一起使用,已经在 Stackoverflow 上传播了很长时间,现在是时候把它退休了。
确实,HttpContext当 WebSocket 连接正在运行时不可用,但必须明确:当您键入 url 并按 Enter 按钮时,与服务器端 Blazor 应用程序的连接是 HTTP 连接,而不是 WebSocket 连接。
因此,您的应用程序可以访问和使用 HttpContext与在 Razor Pages 应用程序或 MVC 应用程序中使用的方式相同,包括获取用户代理和 IP 地址。以下代码示例演示了如何使用 HttpContext本地获取用户代理和 IP 地址,而不使用 JSInterop这应该用作最后的手段,并将提取的值传递给 App成分。

  • 将文件添加到 Pages文件夹并将其命名 _Host.cshtml.cs .
  • 将此代码添加到文件中:

  • public class HostModel: PageModel
    {
    private readonly IHttpContextAccessor _httpContextAccssor;

    public HttpContextFeatureModel(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;
  • 将以下行添加到您的 Host.cshthml页面(在靠近使用和那些东西的页面顶部):

  • @model HostModel
  • App组件,定义两个参数属性,它们将获取和存储从位于 _Host.cshtml 中的组件标记传递给它的用户代理和 IP 地址。 .

  • App.razor:
    <p>UserAgent: @UserAgent</p>
    <p>IPAddress: @IPAddress</p>

    @code
    {
    [Parameter]
    public string UserAgent { get; set; }

    [Parameter]
    public string IPAddress { get; set; }
    }
  • _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>
  • 添加 services.AddHttpContextAccessor();StartupConfigureServices方法来启用对 HttpContext 的访问。

  • 就这些。您可以添加 Identity UI也适用于您的 Blazor 服务器应用程序,并应用上述相同的过程从 HttpContext 中提取 claim 主体。 , 在用户通过身份验证后(这样做仅用于学习目的,因为您应该使用 AuthenticationStateProvider 代替)。
    Here's also a link到有关当前主题的官方文档。

    关于blazor - 如何在服务器端 Blazor 中使用 HttpContext 对象来检索有关用户、用户代理的信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59538318/

    37 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com