c# Minimal API .NET 6.0,如何获取客户端ip?

Raf*_*aya 5 c# asp.net minimal-apis

我使用 Microsoft https://learn.microsoft.com/en-us/aspnet/core/fundamentals/minimal-apis?view=aspnetcore-6.0的链接来创建我的 Web api。

之后,我像这样添加数据库:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<Context>(opt => opt.UseSqlServer(
    builder.Configuration.GetConnectionString("Default")
));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
var app = builder.Build();
Run Code Online (Sandbox Code Playgroud)

我的功能是这样的:

app.MapGet("/SomeRoute/{data}", async (long data, Context appDb) =>
{    
    var tabladata = await appDb.Table1
        .Where(some code here)
        .ToListAsync();
    return Results.Ok(tabladata);
});
Run Code Online (Sandbox Code Playgroud)

我发现我可以使用以下代码获取 IP 客户端: 在 var app = builder.Build(); 之前添加此代码

builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
Run Code Online (Sandbox Code Playgroud)

之后:

app.UseForwardedHeaders();
Run Code Online (Sandbox Code Playgroud)

最后看起来像这样:

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<Context>(opt => opt.UseSqlServer(
    builder.Configuration.GetConnectionString("Default")
));
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});

builder.Services.AddDatabaseDeveloperPageExceptionFilter();
var app = builder.Build();
app.UseForwardedHeaders();
Run Code Online (Sandbox Code Playgroud)

我如何获得调用 Web api 函数的 IP 客户端?

谢谢。

Raf*_*aya 8

找到了解决方案。\n此处:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/http-context ?view=aspnetcore-6.0

\n

他们告诉您如何在“使用最小 API 中的 HttpContext”标题下获取 HTTPContext。你只需要添加参数就可以了,我不知道为什么,但是如果你把它放在那里你就会得到参数。

\n
app.MapGet("/", (HttpContext context) => context.Response.WriteAsync("Hello World"));\n
Run Code Online (Sandbox Code Playgroud)\n

之后,在此页面中:https://www.codegrepper.com/code-examples/csharp/asp+net+core+web+api+get+client+ip+address \n他们告诉你如何获取客户端IP使用上下文。像这样:

\n
var ip = _accessor.ActionContext.HttpContext.Connection.RemoteIpAddress.ToString();\n
Run Code Online (Sandbox Code Playgroud)\n

最后我像这样修改我的代码:

\n
app.MapGet("/someRoute/{data}", async (\n    long data, DatabaseContext appDb, HttpContext context) =>\n{\n    var remoteIp = context.Connection.RemoteIpAddress;\n        string clientIp = "";\n        if(remoteIp != null)\n        {\n            clientIp = remoteIp.ToString();\n        }\n
Run Code Online (Sandbox Code Playgroud)\n

它有效。\n希望这对其他人有帮助。

\n