如何在Azure函数内以编程方式获取FunctionNameAttribute指定的函数名?
如何在Azure Functions中获取FunctionName属性值
我来帮你解决这两个关于Azure Functions中FunctionName属性的问题,这里有两种实用的方案,优先推荐更简洁的第一种:
方法一:使用ExecutionContext(推荐)
Azure Functions自带的ExecutionContext对象直接包含了当前函数的FunctionName属性值,这是最直观且性能友好的方式。你只需要把它作为参数注入到函数的Run方法里就行:
修改你的代码如下:
public static class GetUser { [FunctionName("GetUser")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "users/{id}")] HttpRequest req, String id, ILogger log, ExecutionContext context) { // 添加ExecutionContext参数 // 直接拿到FunctionName属性设置的值 string functionName = context.FunctionName; if (!await PermissionsHelper.userHasPermission(functionName, TokenHelper.getTokenValue(req, "oid"))) return new UnauthorizedResult(); // 后续业务逻辑... return new OkResult(); } }
这个方法完全不需要反射,代码清晰易懂,还能避免反射带来的额外性能开销。
方法二:使用反射获取FunctionNameAttribute
如果因为特殊场景无法使用ExecutionContext,可以通过反射获取当前方法上的FunctionNameAttribute:
public static class GetUser { [FunctionName("GetUser")] public static async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "users/{id}")] HttpRequest req, String id, ILogger log) { // 通过反射定位当前方法的FunctionNameAttribute var currentMethod = System.Reflection.MethodBase.GetCurrentMethod(); var functionNameAttr = currentMethod.GetCustomAttributes(typeof(Microsoft.Azure.WebJobs.FunctionNameAttribute), false) .FirstOrDefault() as Microsoft.Azure.WebJobs.FunctionNameAttribute; // 处理属性不存在的边界情况 string functionName = functionNameAttr?.Name ?? "UnknownFunction"; if (!await PermissionsHelper.userHasPermission(functionName, TokenHelper.getTokenValue(req, "oid"))) return new UnauthorizedResult(); // 后续业务逻辑... return new OkResult(); } }
关于获取FunctionNameAttribute本身
如果你需要的是FunctionNameAttribute对象本身(而不只是它的Name值),上面反射代码里的functionNameAttr变量就是你要的,你可以直接把它传递给其他方法或者读取它的属性信息。
内容的提问来源于stack exchange,提问作者Chris Gunawardena
相关产品推荐
相关产品推荐

