在特定条件下禁用 Azure Function

Disable Azure Function on a particular condition

我们有一个 azure 函数,我们调用了几个 API。它是一个 eventhub 触发函数。我们有一个场景,我们调用的 api 经常进入计划维护。我们想建立一个重试机制,我们重试 x 次,失败时我们想在运行时禁用该功能。有没有办法在函数应用程序本身中做到这一点?

谢谢Melissa and Ian Kemp。发布您的建议作为答案以帮助其他社区成员。

使用以下代码禁用 Azure 函数

public class FunctionsHelper
{
    private readonly ClientSecretCredential _tokenCredential;
    private readonly HttpClient _httpClient;

    public FunctionsHelper(string tenantId, string clientId, string clientSecret, string subscriptionId, string resourceGroup, string functionAppName)
    {
        var baseUrl =
            $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Microsoft.Web/sites/{functionAppName}/";
        var httpClient = new HttpClient
        {
            BaseAddress = new Uri(baseUrl)
        };

        _httpClient = httpClient;
        
        _tokenCredential = new ClientSecretCredential(tenantId, clientId, clientSecret);
    }

    private async Task SetAuthHeader()
    {
        var accessToken = await GetAccessToken();
        _httpClient.DefaultRequestHeaders.Authorization = AuthenticationHeaderValue.Parse($"Bearer {accessToken}");
    }

    private async Task<string> GetAccessToken()
    {
        return (await _tokenCredential.GetTokenAsync(
            new TokenRequestContext(new[] {"https://management.azure.com/.default"}))).Token;
    }
    
    public async Task StopFunction(string functionName)
    {
        await SetFunctionState(functionName, isDisabled: true);
    }

    public async Task StartFunction(string functionName)
    {
        await SetFunctionState(functionName, isDisabled: false);
    }

    private async Task SetFunctionState(string functionName, bool isDisabled)
    {
        await SetAuthHeader();
        var appSettings = await GetAppSettings();
        appSettings.properties[$"AzureWebJobs.{functionName}.Disabled"] = isDisabled ? "1" : "0";

        var payloadJson = JsonConvert.SerializeObject(new
        {
            kind = "<class 'str'>", appSettings.properties
        });

        var stringContent = new StringContent(payloadJson, Encoding.UTF8, "application/json");
        
        await _httpClient.PutAsync("config/appsettings?api-version=2019-08-01", stringContent);
    }
    
    private async Task<AppSettings> GetAppSettings()
    {
        var res  = await _httpClient.PostAsync("config/appsettings/list?api-version=2019-08-01", null);
        
        var content = await res.Content.ReadAsStringAsync();
        
        return JsonConvert.DeserializeObject<AppSettings>(content);
    }
}

internal class AppSettings
{ 
    public Dictionary<string, string> properties { get; set; }
}

查看 了解更多信息。