【问题标题】:The best way to get the client IP address in Azure durable function?在 Azure 持久功能中获取客户端 IP 地址的最佳方法是什么?
【发布时间】:2021-09-15 16:11:08
【问题描述】:

在 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;

返回空字符串。

我看过这个similar question,但它假定请求的类型是HttpRequest。就我而言,它是HttpRequestMessage

This answer 建议必须先启用X-Forwarded-For 标头。但我不知道如何在我的 Azure Function App(或我的持久功能)中执行此操作。

我正在使用 VS Code 在本地开发我的 Azure 函数。

【问题讨论】:

    标签: .net-core azure-functions azure-durable-functions


    【解决方案1】:

    经过一番尝试,我设法使this answer 适应了我的Azure Durable Function。我还发现这个关于如何使用dependency injection in Azure functions 的信息非常方便。步骤如下:

    1. Startup.cs中项目的Startup类中添加如下方法:
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
            }
    
    1. 将以下using 语句添加到Startup.csusing 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-25
      • 2018-06-10
      • 2018-03-19
      • 2019-01-14
      • 1970-01-01
      相关资源
      最近更新 更多