Azure functions 是否可以从azure函数中为EventGrid生成TriggerUrl?

Azure functions 是否可以从azure函数中为EventGrid生成TriggerUrl?,azure-functions,azure-eventgrid,Azure Functions,Azure Eventgrid,我的azure函数解决方案中有一个EventGrid触发器 我想使用URL上的函数键/代码生成触发器URL,以便从函数本身中订阅eventgrid主题。但是我找不到任何方法来获取函数的资源id或获取实际代码。有可能吗?我相信您可以使用RESTAPI获取一个函数的触发器URL,您知道该函数的资源ID。以下是根据文档的API调用,以供参考 POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{

我的azure函数解决方案中有一个EventGrid触发器

我想使用URL上的函数键/代码生成触发器URL,以便从函数本身中订阅eventgrid主题。但是我找不到任何方法来获取函数的资源id或获取实际代码。有可能吗?

我相信您可以使用RESTAPI获取一个函数的触发器URL,您知道该函数的
资源ID
。以下是根据文档的API调用,以供参考

POST https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Web/sites/{name}/functions/{functionName}/listsecrets?api-version=2016-08-01

另外请注意,拨打此电话时最好使用此功能。

当MSI为该功能启用时,我可以获取应用程序的resourceId并向ARM请求令牌

    public async Task<JToken> ListHostKeys()
    {
        var handler = new JwtSecurityTokenHandler();
        var jsonToken = handler.ReadToken(this.httpClient.DefaultRequestHeaders.Authorization.Parameter) as JwtSecurityToken;
        var resourceId=jsonToken.Claims.FirstOrDefault(c => c.Type == "xms_mirid")?.Value;
        var rsp = await httpClient.PostAsync($"https://management.azure.com{resourceId}/host/default/listKeys?api-version=2018-11-01", new StringContent(""));
        return JToken.Parse(await rsp.Content.ReadAsStringAsync());
    }

    builder.Services.AddHttpClient<ArmClient>((sp, http) =>
        {
            try
            {
                var tokenProvider = new AzureServiceTokenProvider();

                var accessToken = tokenProvider.GetAccessTokenAsync("https://management.azure.com/").GetAwaiter().GetResult();

                http.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", accessToken);
            }
            catch (Exception)
            {

            }
        });
公共异步任务ListHostKeys()
{
var handler=新的JwtSecurityTokenHandler();
var jsonToken=handler.ReadToken(this.httpClient.DefaultRequestHeaders.Authorization.Parameter)作为JwtSecurityToken;
var resourceId=jsonToken.Claims.FirstOrDefault(c=>c.Type==“xms\u mirid”)?.Value;
var rsp=wait httpClient.PostAsync($”https://management.azure.com{resourceId}/host/default/listKeys?api版本=2018-11-01“,新StringContent(“”);
返回JToken.Parse(等待rsp.Content.ReadAsStringAsync());
}
builder.Services.AddHttpClient((sp,http)=>
{
尝试
{
var tokenProvider=新AzureServiceTokenProvider();
var accessToken=tokenProvider.GetAccessTokenAsync(“https://management.azure.com/).GetAwaiter().GetResult();
http.DefaultRequestHeaders.Authorization=新系统.Net.http.Headers.AuthenticationHeaderValue(“承载者”,accessToken);
}
捕获(例外)
{
}
});
然后,当需要提供回调url时,我可以执行以下操作:

    private async Task<IOBoardCollection> CreateIOBoardCollectionAsync(JToken unit)
    {
        //Create the collection on io-board.com


            var code = "";
            try
            {
                if (Environment.GetEnvironmentVariable("WEBSITE_HOSTNAME").Contains("azurewebsites"))
                {
                    var keys = await armClient.ListHostKeys();
                    logger.LogInformation("Running on azure wbsites {keys}", keys?.ToString().Substring(10));
                    code = keys.SelectToken("$.systemKeys.eventgrid_extension").ToString();

                }
            }
            catch (Exception ex)
            {
                logger.LogError(ex, "Failed to get code");
            }
            var metadata = unit.ToObject<TrackUnitProperties>();
            metadata.EntityKey = context.EntityKey;

            return await IOBoardClient.CreateCollectionAsync(
                IOBoardClient.SubscriptionId, metadata,
                $"https://{Environment.GetEnvironmentVariable("WEBSITE_HOSTNAME") ?? "io-board.eu.ngrok.io"}/runtime/webhooks/EventGrid?functionName=EventGridTrigger&code={code}");



    }
专用异步任务CreateIOBoardCollectionAsync(JToken单元)
{
//在io-board.com上创建集合
var代码=”;
尝试
{
if(Environment.GetEnvironmentVariable(“网站名称”)包含(“azurewebsites”))
{
var keys=wait armClient.ListHostKeys();
logger.LogInformation(“在azure wbsites{keys}上运行”,keys?.ToString().Substring(10));
code=keys.SelectToken(“$.systemKeys.eventgrid_扩展名”).ToString();
}
}
捕获(例外情况除外)
{
logger.LogError(例如,“获取代码失败”);
}
var metadata=unit.ToObject();
metadata.EntityKey=context.EntityKey;
返回等待IOBoardClient.CreateCollectionAsync(
IOBoardClient.SubscriptionId,元数据,
$“https://{Environment.GetEnvironmentVariable(“网站_主机名”)?“io board.eu.ngrok.io}/runtime/webhooks/EventGrid?functionName=EventGridTrigger&code={code}”);
}

您好,如果您研究解决方案,您能将自己的解决方案标记为此问题的答案吗?这将有助于其他人。:)