【问题标题】:functions.json graphToken binding ignored by Azure functionAzure 函数忽略了functions.json graphToken 绑定
【发布时间】:2018-02-07 07:53:31
【问题描述】:

我在一个名为“TestMe”的文件夹中有一个函数,如下所示:

我可以在 VSCode 中构建项目并正常上传,但是 function.json 的内容似乎被忽略了。

我的功能很简单:

    [FunctionName("TestMe")]
    public static IActionResult Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequest req, string graphToken, TraceWriter log)
    {
        log.Info("C# HTTP trigger function processed a request.");

        string name = req.Query["name"];

        string requestBody = new StreamReader(req.Body).ReadToEnd();
        dynamic data = JsonConvert.DeserializeObject(requestBody);
        name = name ?? data?.name;

        return name != null
            ? (ActionResult)new OkObjectResult($"Hello, {name}")
            : new BadRequestObjectResult("Please pass a name on the query string or in the request body");
    }

和function.json:

{
  "bindings": [
    {
      "name": "req",
      "type": "httpTrigger",
      "direction": "in"
    },
    {
      "type": "token",
      "direction": "in",
      "name": "graphToken",
      "resource": "https://graph.microsoft.com",
      "identity": "userFromRequest"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    }
  ],
  "disabled": false
}

我按照指南 here 进行操作,我以为我可以在其中获得一个 graphToken,但我得到的只是这个错误:

Microsoft.Azure.WebJobs.JobHost.Validate(IFunctionDefinition 函数, 对象键)在 JobHost.cs Microsoft.Azure.WebJobs.JobHost+d__36.MoveNext() 在 作业主机.cs System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) Microsoft.Azure.WebJobs.Script.ScriptHost+d__86.MoveNext() 在 ScriptHost.cs System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) Microsoft.Azure.WebJobs.Script.WebHost.Middleware.FunctionInvocationMiddleware+d__4.MoveNext() 在 FunctionInvocationMiddleware.cs System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) Microsoft.Azure.WebJobs.Script.WebHost.Middleware.FunctionInvocationMiddleware+d__3.MoveNext() 在 FunctionInvocationMiddleware.cs System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.GetResult() Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware+d__7.MoveNext()

所以我尝试禁用该函数并再次从 VSCode 构建/上传 azure 函数,但我仍然可以访问该函数,让我相信 function.json 被忽略了。

【问题讨论】:

    标签: c# json azure azure-functions


    【解决方案1】:

    看起来您正在使用预编译的 C# 函数,这意味着您有一个 csproj 文件,并且您的函数被编译为 DLL,然后部署到 Azure。

    在这种情况下,function.json 由 Functions SDK 自动生成,您不应对该文件进行任何手动更改。触发器将自动放置到function.json,所有其他绑定都是从函数签名和属性中推断出来的。

    因此,您应该将Token 属性放在graphToken 参数上,如here 所述:

    在 C# 类库中,使用在 NuGet 包 Microsoft.Azure.WebJobs.Extensions.AuthTokens 中定义的 Token 属性。

    【讨论】:

    • 我刚刚尝试过,看起来它正朝着正确的方向前进,但现在我收到一个参数异常“System.ArgumentException:需要资源才能代表用户获取身份验证令牌。 "函数为:"public static IActionResult Run([ HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)]HttpRequest req, [Token]string graphToken, TraceWriter log)"
    • 需要在Token属性中指定resourceidentity参数
    • 哦,我确实尝试过:[Token(Resource="graph.microsoft.com", Identity=TokenIdentityMode.UserFromRequest)]string graphToken,但出现异常:ArgumentNullException:值不能为空。参数名称:clientSecret
    • 但是你确实给了我正确的答案,现在我只需要解决这个问题:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 2021-09-28
    • 1970-01-01
    • 2019-12-20
    相关资源
    最近更新 更多