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

时间:2019-12-31 00:30:54

标签: blazor blazor-server-side

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

2 个答案:

答案 0 :(得分:1)

关于HttpContext对象不能与Blazor Server App一起使用的说法已经在stackoverflow中长期传播,现在是时候对其进行淘汰了。的确,当WebSocket连接处于运行状态时,HttpContext不可用,但必须明确这一点:当您键入url并按Enter键时,与服务器端Blazor应用程序的连接是HTTP连接,而不是WebSocket连接。因此,您的应用程序可以以与Razor Pages应用程序或mvc应用程序相同的方式访问和使用HttpContext,包括获取用户代理和IP地址。下面的代码示例演示如何使用HttpContext本地获取用户代理和IP地址,而无需使用应作为最后手段的JSInterop并将提取的值传递给App组件。

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

    public class HttpContextFeatureModel : 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;

  1. 在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; }
}
  1. 在_Host.cshtml中更新组件标签,如下所示:

    <app> <component type="typeof(App)" render-mode="ServerPrerendered" param-UserAgent="@Model.UserAgent" param-IPAddress="@Model.IPAddress" /> </app>

  2. 向Startup.ConfigureServices方法添加services.AddHttpContextAccessor();以启用对HttpContext的访问。

仅此而已。您还可以将Identity UI添加到您的Server Blazor应用程序中,并应用上面显示的相同过程,以在用户进行身份验证后从HttpContext中提取声明主体(这样做仅出于学习目的,您应该使用而不是AuthenticationStateProvider)。这也是我刚刚回答的有关在Blazor服务器中设置同意Cookie的问题的链接Here's also a link

答案 1 :(得分:0)

在您的启动> ConfigureServices中:

 services.AddControllers();

在您的启动>配置中:

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

添加一个文件夹名称:控制器

添加一个控制器名称:InitController

添加这样的方法:

   [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();


        }
}