How to use the HttpContext object in server-side Blazor to retrieve information about the user, user agent

三世轮回 提交于 2020-01-11 13:19:09

问题


IP Address, and such like. Very often when users ask how to do it in Server Blazor app, they are either told that it is not possible, or sometimes offered partial solutions employing JSInterop. But can it be done without resorting to JSInterop ? Here's the answer...


回答1:


The fiction that the HttpContext object can't be used with Blazor Server App, has been long propagated in stackoverflow, and it is high time to pension it off. It is true that the HttpContext is not available when a WebSocket connection is in operation, but this must be clear: When you type a url and press the enter button the connection to your server-side Blazor app is an HTTP connection, and not a WebSocket connection. Thus, your app can access and use the HttpContext in the same way it is used in a Razor Pages App or an mvc App, including getting a User Agent and an IP Address. The following code sample demonstrates how to use the HttpContext to get the User Agent and IP Address natively, without using JSInterop which should be used as a last resort, and pass the extracted values to the App component.

  1. Add a file to the Pages folder and name it _Host.cshtml.cs
  2. Add this code to the file:

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

    }

You may need one or more of these: 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. Define in the App component two parameter properties which will get and store the User Agent and IP Address passed to it from the component tag in located in _Host.cshtml

App.Razor

<p>UserAgent: @UserAgent</p>
<p>IPAddress: @IPAddress</p>
@code{
    [Parameter]
    public string UserAgent { get; set; }
    [Parameter]
    public string IPAddress { get; set; }
}
  1. In _Host.cshtml update the component tag like this:

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

  2. Add services.AddHttpContextAccessor(); to the Startup.ConfigureServices method to enable access to the HttpContext.

That is all. You can also add to your app the Identity UI to your Server Blazor App, and apply the same procedure shown above, to extract the claims principal from the HttpContext, after the user has authenticated (do that for learning purpose only, as you should use the AuthenticationStateProvider instead). Here's also a link Here's also a link to a question I've just answered about setting consent cookie in Blazor Server




回答2:


In Your Startup > ConfigureServices :

 services.AddControllers();

In Your Startup > Configure:

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

add a folder name it : Controllers

add a controller name it : InitController

add a method like this :

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


            return LocalRedirect(redirectUri);
        }
}

in request varible ,all data are exists

at last for redirecting user from pages or components use this code :

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


        }
}


来源:https://stackoverflow.com/questions/59538318/how-to-use-the-httpcontext-object-in-server-side-blazor-to-retrieve-information

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!