如何将 Blazor 服务器端客户端 IP 地址转发到 ASP.NET Core 服务器后端

问题描述 投票:0回答:1

服务器端 blazor 服务器和 API 服务器运行在同一台计算机上,当请求从客户端发送到 API 服务器时,显然是从 blazor 服务器端服务器发送的。

如何将客户端IP地址转发到后端服务器?

我的想法是使用

DelegatingHandler
来代替我的
HttpClient
,但据我所知,没有可靠的方法来获取
HttpContext
中的
DelegatingHandler

asp.net-core http-headers blazor-server-side dotnet-httpclient forwarding
1个回答
0
投票

如何将客户端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");
    }
}

输出:

注意:如需了解详情,请参考此官方文档

© www.soinside.com 2019 - 2024. All rights reserved.