问题
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.
- Add a file to the Pages folder and name it _Host.cshtml.cs
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;
- 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; }
}
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>
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