C# 为什么方法重载会破坏Azure函数路由?

C# 为什么方法重载会破坏Azure函数路由?,c#,asp.net-web-api,azure-functions,C#,Asp.net Web Api,Azure Functions,假设我在Azure Function项目中有一个C#方法,它看起来像这样,并且工作得非常完美: [FunctionName( nameof( GetContents) )] public static async Task<IActionResult> GetContents( [HttpTrigger( AuthorizationLevel.Function, "get", Route="/v1/Contents/{id}" )] HttpR

假设我在Azure Function项目中有一个C#方法,它看起来像这样,并且工作得非常完美:

[FunctionName( nameof( GetContents) )]
public static async Task<IActionResult> GetContents( [HttpTrigger( AuthorizationLevel.Function, "get", Route="/v1/Contents/{id}" )] HttpRequest req, ILogger log, string id ) {
// ...
}
[FunctionName(nameof(GetContents))]
公共静态异步任务GetContents([HttpTrigger(AuthorizationLevel.Function,“get”,Route=“/v1/Contents/{id}”)]HttpRequest请求,ILogger日志,字符串id){
// ...
}
到目前为止还不错。现在,创建一个完全没有路由的重载,它根本不是一个web服务,并且只打算用作其他服务的帮助器:

public static async Task<ObjectResult> GetContents( ILogger log, string id, bool isAdmin ) {
// ...
}
公共静态异步任务GetContents(ILogger日志、字符串id、bool isAdmin){
// ...
}

现在,原来的web服务方法不再正确路由。如果你试着击中它,你会得到一个404。这一点,尽管它已经工作得非常完美,而且没有任何变化。重载是如何破坏原始方法的功能的?

Azure函数主机尝试使用级联方法解析该方法,首先在编译的
函数.json
中显式定义名为
入口点的方法。看

如果入口点方法名称可以返回多个公共方法,Azure函数解析程序将由于不明确而引发异常。看

private static T GetNamedMethod(IEnumerable方法、string方法名、StringComparison StringComparison),其中T:IMethodReference
{
var namedMethods=方法
.Where(m=>m.IsPublic&&string.Compare(m.Name、methodName、stringComparison)==0)
.ToList();
//如果有一个方法与提供的名称匹配,请使用它。
if(namedMethods.Count==1)
{
返回namedMethods[0];
}
//如果有多个公共方法与提供的名称匹配,则引发编译异常
如果(namedMethods.Count>1)
{
抛出CreateCompilationException(DotNetConstants.AmbiguousFunctionEntryPointsComplationCode,
“歧义函数入口点”。多种方法名为“{MultNeX}”。“,$”多个方法名为“{MultNeX}”。考虑重命名方法。“”;
}
}

我很惊讶这是一个实现,因为它基本上强制函数名全局唯一,这在C#中是前所未有的。但是,这确实是一种执行,我同意。我怀疑更好的方法是在执行方法上方使用decorator发现入口点。
private static T GetNamedMethod<T>(IEnumerable<T> methods, string methodName, StringComparison stringComparison) where T : IMethodReference
{
    var namedMethods = methods
                .Where(m => m.IsPublic && string.Compare(m.Name, methodName, stringComparison) == 0)
                .ToList();

    // If we have single method that matches the provided name, use it.
    if (namedMethods.Count == 1)
    {
        return namedMethods[0];
    }

    // If we have multiple public methods matching the provided name, throw a compilation exception
    if (namedMethods.Count > 1)
    {
        throw CreateCompilationException(DotNetConstants.AmbiguousFunctionEntryPointsCompilationCode,
            $"Ambiguous function entry points. Multiple methods named '{methodName}'.", $"Multiple methods named '{methodName}'. Consider renaming methods.");
    }
}