.NET 6 Azure Functions项目能否兼容两种Function特性?
我正在维护一个基于.NET 6的Azure Functions项目,其中包含使用Microsoft.Azure.Functions.Worker.FunctionAttribute定义的Worker模型函数,示例代码如下:
using Microsoft.Azure.Functions.Worker; [Function("TestFunction")] public async Task Run([HttpTrigger(AuthorizationLevel.Function, FunctionSettings.HttpGet, Route = FunctionSettings.CycleCountEndpoint)] FunctionContext context) { await _repo.RunSomething(); } }
之后为处理长运行任务,添加了使用Microsoft.Azure.WebJobs.FunctionNameAttribute定义的Azure Durable Function,代码如下:
using Microsoft.Azure.WebJobs; using Microsoft.Azure.WebJobs.Extensions.DurableTask; using Microsoft.Azure.WebJobs.Extensions.Http; using Microsoft.Extensions.Logging; using System.Net.Http; public static class TestDurableFunction { [FunctionName("TestDurableFunction")] public static async Task<HttpResponseMessage> HttpStart([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestMessage req, [DurableClient] IDurableOrchestrationClient starter, ILogger log) { string instanceId = await starter.StartNewAsync("TestOrchestrator", null); log.LogInformation($"Started orchestration with ID = '{instanceId}'."); return starter.CreateCheckStatusResponse(req, instanceId); } }
运行项目时,带[Function("TestFunction")]的函数能在控制台显示,但带[FunctionName("TestDurableFunction")]的Durable函数不显示,想知道这两类函数能否在同一应用中共存并正常运行?
解决方案
这两类函数可以共存,但当前问题源于你混用了Azure Functions的两种运行时模型:隔离Worker模型(依赖Microsoft.Azure.Functions.Worker命名空间)和In-Process模型(依赖Microsoft.Azure.WebJobs命名空间)。Durable Functions对隔离模型有专门的适配要求,需按以下步骤调整:
1. 替换Durable相关NuGet包
移除基于In-Process模型的Microsoft.Azure.WebJobs.Extensions.DurableTask包,安装针对隔离Worker模型的Microsoft.Azure.Functions.Worker.Extensions.DurableTask包。
2. 适配Durable函数代码到隔离模型
修改Durable函数的属性、参数类型,匹配隔离模型的API规范:
using Microsoft.Azure.Functions.Worker; using Microsoft.Azure.Functions.Worker.Http; using Microsoft.Azure.Functions.Worker.Extensions.DurableTask; using Microsoft.Extensions.Logging; public static class TestDurableFunction { [Function("TestDurableFunction")] public static async Task<HttpResponseData> HttpStart( [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post")] HttpRequestData req, [DurableClient] IDurableOrchestrationClient starter, FunctionContext executionContext) { ILogger logger = executionContext.GetLogger("TestDurableFunction"); string instanceId = await starter.StartNewAsync("TestOrchestrator", null); logger.LogInformation($"Started orchestration with ID = '{instanceId}'."); return starter.CreateCheckStatusResponse(req, instanceId); } [Function("TestOrchestrator")] public static async Task RunOrchestrator( [OrchestrationTrigger] IDurableOrchestrationContext context) { // 编写你的长运行任务编排逻辑 } }
3. 更新host.json配置
在项目的host.json中添加Durable Functions的配置节点,确保运行时能识别Durable扩展:
{ "version": "2.0", "logging": { "applicationInsights": { "samplingSettings": { "isEnabled": true, "excludedTypes": "Request" } } }, "extensions": { "durableTask": { "hubName": "DurableFunctionsHub" } } }
4. 统一依赖版本
确保项目中所有Azure Functions相关包(如Microsoft.Azure.Functions.Worker、Microsoft.Azure.Functions.Worker.Extensions.Http)的版本保持兼容,避免同时存在In-Process和隔离模型的包依赖。
内容的提问来源于stack exchange,提问作者user2370664

