基于Azure Function搭建C# API/控制台程序跨系统调度方案咨询
解决方案架构与实现指南
一、整体架构梳理
明确各组件职责,确保跨系统解耦:
- 外部系统B:推送业务Payload到Azure Function的HTTP触发端点
- Azure Function:接收并校验Payload,根据需求转发至应用A或持久化到Azure存储,作为跨系统中介
- 应用A:ASP.NET C# Web API/控制台程序,执行定时任务或实时业务逻辑
- 本地EXE:生成特定Payload并调用Azure Function,分担API调用与数据构造复杂度
二、搭建ASP.NET C# Web API/控制台程序
1. Web API(实时/定时任务接收端)
创建ASP.NET Core Web API项目,实现任务执行接口与定时任务逻辑:
核心控制器代码
[ApiController] [Route("api/tasks")] public class TaskExecutorController : ControllerBase { private readonly ITaskService _taskService; public TaskExecutorController(ITaskService taskService) { _taskService = taskService; } // 接收Azure Function转发的Payload并执行任务 [HttpPost("execute")] public async Task<IActionResult> ExecuteTask([FromBody] TaskPayload payload) { try { await _taskService.RunBusinessTask(payload); return Ok(new { Status = "Success", Message = "任务执行完成" }); } catch (Exception ex) { return BadRequest(new { Status = "Failed", Message = ex.Message }); } } } // 与Azure Function统一的Payload模型 public class TaskPayload { public string ExternalId { get; set; } public string DataContent { get; set; } // 按需添加外部系统B返回的字段 }
定时任务实现(基于IHostedService)
如果需要定时读取Azure存储中的Payload执行任务:
public class TimedTaskService : IHostedService, IDisposable { private Timer _timer; private readonly IServiceProvider _serviceProvider; private readonly string _storageConnString = "<你的Azure存储连接字符串>"; public TimedTaskService(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public Task StartAsync(CancellationToken stoppingToken) { // 设定定时规则,例如每小时执行一次 _timer = new Timer(RunTimedTask, null, TimeSpan.Zero, TimeSpan.FromHours(1)); return Task.CompletedTask; } private async void RunTimedTask(object state) { using var scope = _serviceProvider.CreateScope(); var taskService = scope.ServiceProvider.GetRequiredService<ITaskService>(); // 从Azure Blob存储读取未处理的Payload var blobClient = new BlobServiceClient(_storageConnString).GetBlobContainerClient("task-payloads"); await foreach (var blob in blobClient.GetBlobsAsync()) { using var stream = new MemoryStream(); await blobClient.GetBlobClient(blob.Name).DownloadToAsync(stream); stream.Position = 0; var payload = JsonSerializer.Deserialize<TaskPayload>(new StreamReader(stream).ReadToEnd()); await taskService.RunBusinessTask(payload); // 处理完成后删除Blob await blobClient.GetBlobClient(blob.Name).DeleteAsync(); } } public Task StopAsync(CancellationToken stoppingToken) { _timer?.Change(Timeout.Infinite, 0); return Task.CompletedTask; } public void Dispose() { _timer?.Dispose(); } }
在Program.cs注册定时服务:
builder.Services.AddHostedService<TimedTaskService>();
2. 本地控制台EXE(调用Azure任务)
创建.NET控制台应用,实现Azure Function的调用逻辑:
class Program { static async Task Main(string[] args) { using var httpClient = new HttpClient(); // Azure Function的HTTP触发地址+访问密钥 var functionUrl = "https://<你的函数应用名>.azurewebsites.net/api/ReceivePayload?code=<你的函数密钥>"; // 本地生成Payload,分担构造复杂度 var localPayload = new TaskPayload { ExternalId = Guid.NewGuid().ToString(), DataContent = "本地EXE构造的业务数据" }; var jsonContent = new StringContent( JsonSerializer.Serialize(localPayload), Encoding.UTF8, "application/json" ); var response = await httpClient.PostAsync(functionUrl, jsonContent); if (response.IsSuccessStatusCode) { Console.WriteLine($"任务触发成功:{await response.Content.ReadAsStringAsync()}"); } else { Console.WriteLine($"任务触发失败:{response.StatusCode}"); } } }
三、Azure Function中介功能搭建与连接
1. 创建HTTP触发的Azure Function
在Visual Studio或Azure门户创建C#语言的HTTP触发Function,实现Payload处理逻辑:
public static class PayloadReceiverFunction { [FunctionName("ReceivePayload")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("接收到外部系统/本地EXE的Payload"); var requestBody = await new StreamReader(req.Body).ReadToEndAsync(); var payload = JsonSerializer.Deserialize<TaskPayload>(requestBody); // 方案1:实时转发至应用A的Web API var apiClient = new HttpClient(); var appAUrl = "https://<你的应用A域名>/api/tasks/execute"; var apiResponse = await apiClient.PostAsync(appAUrl, new StringContent(requestBody, Encoding.UTF8, "application/json")); // 方案2:持久化到Azure Blob存储,供定时任务读取 // var blobClient = new BlobServiceClient("<你的存储连接字符串>").GetBlobContainerClient("task-payloads"); // await blobClient.UploadBlobAsync($"{payload.ExternalId}.json", new MemoryStream(Encoding.UTF8.GetBytes(requestBody))); return new OkObjectResult("Payload已处理,任务已触发"); } }
2. 跨系统连接关键配置
- 网络互通:若应用A为本地部署,需通过Azure VPN Gateway或端口映射确保Azure Function可访问;若应用A部署在Azure,直接配置网络规则允许Function的IP段访问
- 认证授权:Azure Function开启Function级密钥认证(在门户的Function详情页获取密钥),应用A的Web API可添加API密钥或JWT认证,限制仅Azure Function调用
- Payload可靠性:使用Azure Blob/Table Storage持久化Payload,避免网络波动导致数据丢失
内容的提问来源于stack exchange,提问作者nikhil nishant
相关产品推荐
相关产品推荐

