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