You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 13:55:37