在Azure持久函数中获得客户端IP地址的最佳方法是什么?



在Azure持久函数中获取远程IP地址(发出请求的客户端地址)的正确方法是什么?

HttpStart方法的开始

public static async Task<HttpResponseMessage> HttpStart(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "report-data/get")]
HttpRequestMessage req,
[DurableClient] IDurableOrchestrationClient starter, ILogger log)
{

我试过了((HttpContext)req.Properties["MS_HttpContext"]).Connection.RemoteIpAddress.ToString();,但缺少MS_HttpContext属性

我也试过

string result = string.Empty;
if (req.Headers.TryGetValues("X-Forwarded-For", out IEnumerable<string> headerValues))
{
result = headerValues.FirstOrDefault();
}
return result;

返回一个空字符串。

我看过这个类似的问题,但它假设请求的类型是HttpRequest。在我的例子中,它是HttpRequestMessage

这个答案表明必须首先启用X-Forwarded-For报头。但是我不知道如何在我的Azure功能应用程序(或我的持久功能)中做到这一点。

我正在本地开发我的Azure功能,使用VS Code。

经过一番尝试,我已经设法使这个答案适应我的Azure Durable Function。我还发现这些关于如何在Azure函数中使用依赖注入的信息非常方便。步骤如下:

  1. 将以下方法添加到Startup.cs中的项目Startup类中:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
  1. using语句添加到Startup.cs中:using Microsoft.AspNetCore.Http;
  2. 将以下私有成员和构造函数添加到我的编排类
private readonly IHttpContextAccessor _accessor;
public GetReportActionsOrchestration(IHttpContextAccessor accessor)
{
_accessor = accessor;
}
  1. 添加以下函数来获取客户端IP地址到我的编排器类:
private string GetClientIpAddress()
{
string ip = _accessor.HttpContext?.Connection?.RemoteIpAddress?.ToString();
return (string.IsNullOrWhiteSpace(ip)) ? string.Empty : ip;
}
  1. 通过从业务流程的HttpStartRunOrchestrator函数中删除static修饰符来修改持久业务流程代码以兼容依赖注入。
  2. 增加string remoteIpAddress = this.GetClientIpAddress();HttpStart函数,获取客户端的IP地址,然后作为参数传递给RunOrchestrator
  3. 对编排器类的更改需要
using Microsoft.AspNetCore.Http;
using System;

最新更新