Azure APIM与函数应用端点一致性配置方案咨询
问题
我需要将Azure门户中所有基于C# .NET Core开发的函数应用导入API Management(APIM),实现APIM端点的一致性,打造单一可信源并高效复用函数。现有3个分功能的函数应用,计划为每个配置专属前缀:
- 函数应用1(用户功能)→
api/v1.0/profiles - 函数应用2(用户服务功能)→
api/v1.0/services - 函数应用3(用户预约功能)→
api/v1.0/appointments
期望APIM端点格式为 https://dev-contoso-apim.azure-api.net/api/v1.0/[对应前缀]/...,但在POC中遇到路由与前缀配置问题。以用户预约可用日期API为例,期望端点是 https://dev-contoso-apim.azure-api.net/api/v1.0/appointments/availableDates/?serviceId=1&branchId=2&startDate=2024-02-01,尝试的三种方案均存在问题:
- 函数Route设为
"v1.0/appointments/availableDates/",APIM前缀为空:端点缺失/api,不符合预期但可正常工作; - 函数Route设为
"availableDates",APIM前缀设为"api/v1.0/appointments":端点符合预期且正常工作,但不利于后续V2版本迭代(无法在服务端添加同路由的新函数); - 函数Route设为
"v1.0/appointments/availableDates/",APIM前缀设为"api":端点符合预期但提示“Resource not found”无法工作。
咨询如何正确配置APIM前缀与函数路由?
正确配置方案
1. 函数应用端路由配置
每个函数的Route仅保留业务路径部分,同时在函数应用的全局配置中统一设置版本+功能前缀,保证函数端的版本独立性,方便后续迭代。
具体操作:
- 针对函数应用3(用户预约),在
local.settings.json(本地开发)或Azure门户的配置→应用程序设置中添加:FUNCTIONS_EXTENSION_VERSION=~4 AzureWebJobsRoutePrefix=v1.0/appointments - 单个函数(如availableDates)的Route属性仅设置为
availableDates:[FunctionName("GetAvailableAppointmentDates")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = "availableDates")] HttpRequest req, ILogger log) { // 函数逻辑 } - 同理,函数应用1的全局路由前缀设为
v1.0/profiles,函数应用2设为v1.0/services,各自的函数仅配置业务路径。
2. APIM端前缀配置
在APIM中导入函数应用时,统一设置API前缀为api,拼接后即可得到符合预期的端点格式。
具体操作:
- 在APIM门户中创建/导入API时,选择函数应用作为数据源;
- 在API设置的前缀字段中填写
api; - 导入完成后,APIM会自动将函数应用的全局路由前缀+函数Route拼接在
api之后,最终端点为:https://dev-contoso-apim.azure-api.net/api/v1.0/appointments/availableDates/
方案问题解析
- 方案1:函数端包含完整路由,但APIM未添加
api前缀,导致缺失统一根路径; - 方案2:版本和功能前缀放在APIM端,函数端仅保留业务路径,后续迭代V2版本时,无法在函数端区分同业务路径的V1、V2函数;
- 方案3:函数端路由包含
v1.0/appointments/availableDates/,APIM添加api前缀后,实际请求路径为api/v1.0/appointments/availableDates/,但Azure函数默认全局路由前缀为api,导致实际匹配路径变成api/api/v1.0/appointments/availableDates/,因此提示资源找不到。
版本迭代支持
后续升级到V2版本时,只需:
- 为对应函数应用添加新的全局路由前缀配置(如
AzureWebJobsRoutePrefix=v2.0/appointments); - 在APIM中导入该函数应用的V2版本,保持APIM前缀为
api,即可得到https://dev-contoso-apim.azure-api.net/api/v2.0/appointments/availableDates/的端点; - 函数端可同时存在V1和V2的函数(通过不同
FunctionName区分),互不影响。
内容的提问来源于stack exchange,提问作者PavanKumar GVVS
相关产品推荐
相关产品推荐

