服务器端 blazor 服务器和 API 服务器运行在同一台计算机上,当请求从客户端发送到 API 服务器时,显然是从 blazor 服务器端服务器发送的。
如何将客户端IP地址转发到后端服务器?
我的想法是使用
DelegatingHandler
来代替我的 HttpClient
,但据我所知,没有可靠的方法来获取 HttpContext
中的 DelegatingHandler
。
如何将客户端IP地址转发到后端服务器?
好吧,无论使用什么技术,为了获取客户端的 IP 地址,首先您需要使用 javascript 检索 IP,然后需要将该 IP 传递给后台,我们需要一个 get/fetch 请求。
一旦您的后端拥有该 IP,您就可以将该 IP 发送到任何地方。对于 blazor 应用程序,您应该使用 JavaScript Interop 来获取它。
让我们实际看看如何在 blazor 服务器应用程序中做到这一点,并最终将该 IP 地址发送到 Web API。
Blazor 服务器端:
@page "/"
<PageTitle>Index</PageTitle>
@inject IJSRuntime JSRuntime
@using Microsoft.JSInterop
@inject HttpClient HttpClient
<h1>Client IP Address :@(clientIp ?? "No IP Found!") </h1>
@code {
public string? clientIp { get; set; }
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
clientIp = await JSRuntime.InvokeAsync<string>("getClientIpAddress");
StateHasChanged();
await ForwardIpToWebAPIServer(clientIp);
}
}
private async Task ForwardIpToWebAPIServer(string clinetIPAddress)
{
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:5094/api/BlazorForwordIP");
request.Headers.Add("Blazor-Client-Ip", clinetIPAddress);
var response = await HttpClient.SendAsync(request);
}
}
<script>
window.getClientIpAddress = function () {
return new Promise((resolve, reject) => {
fetch("https://api64.ipify.org?format=json")
.then(response => response.json())
.then(data => resolve(data.ip))
.catch(error => reject(error));
});
};
</script>
注意: 我正在使用
JSInterop
从 blazor 应用程序调用 IP 跟踪端点。您也可以在一种方法内完成。确保您的参考资料正确。
Blazor 程序.cs:
在您的 blazor 应用程序的 program.cs 文件中包含以下 httpClinet 请求的参考:
builder.Services.AddSingleton<HttpClient>();
Web API 端点:
[Route("api/[controller]")]
[ApiController]
public class BlazorForwordIPController : ControllerBase
{
public IActionResult GetBlazorClientIP()
{
var clientIp = HttpContext.Request.Headers["Blazor-Client-Ip"];
return Ok($"Client IP {clientIp} has been received from blazor endpoint");
}
}
输出:
注意:如需了解详情,请参考此官方文档。