带有Graph Api的Azure Functions计时器

时间:2018-10-22 12:47:26

标签: c# azure-devops microsoft-graph azure-functions office365api

我有一个使用Graph Api的计时器函数(测试版/ v2)。 但出现以下错误。

我现在收到此错误:

  

2018-10-10T08:52:34.019 [错误]   Microsoft.Azure.WebJobs.Host:错误索引方法“ Functions.TimerTriggerMeetingRoom”。 Microsoft.Azure.WebJobs.Host:无法解析绑定参数“标头”。绑定表达式必须映射到触发器提供的值或触发器绑定到的值的属性,或者必须是系统绑定表达式(例如sys.randguid,sys.utcnow等)。

这是我的“ run.csx”代码:

#r "Newtonsoft.Json"
#r "System.Configuration"
#r "System.Data"


using System.Net; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Text;
using System;
using System.Globalization;
using Newtonsoft.Json.Linq;
using Newtonsoft.Json;

using System.Configuration;

using System.Threading.Tasks;

public static async Task Run(TimerInfo myTimer, string graphToken, ILogger log)
{
    var currentTime = DateTime.UtcNow;
    var ramsey = new List<Ramsey>();

    log.LogInformation("C# HTTP trigger function processed a request.");

    HttpClient client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", graphToken);
    var json = await client.GetStringAsync("https://graph.microsoft.com/v1.0/me/");


    log.LogInformation("C# HTTP trigger function processed a request.");
    JObject jResults = JObject.Parse(json);
    //log.LogInformation(jResults.ToString());
    var result= jResults["value"];
    log.LogInformation("value: "+result.ToString());

     return new HttpResponseMessage(HttpStatusCode.OK) 
    {
        Content = new StringContent(json, Encoding.UTF8, "application/json") 
    };
}


public class Ramsey
{
    public string subject { get; set; }
}

“ Function.json”:

{
  "bindings": [
    {
      "name": "myTimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 */15 * * * *"
    },
    {
      "name": "$return",
      "type": "http",
      "direction": "out"
    },
    {
      "type": "token",
      "name": "graphToken",
      "resource": "https://graph.microsoft.com",
      "identity": "UserFromRequest",
      "direction": "in"
    }
  ]
}

这是我的“ functions.proj”文件:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Microsoft.Azure.Mobile.Client" Version="2.0.0"/>
    <PackageReference Include="MySql.Data" Version="7.0.7-m61"/>
  </ItemGroup>
</Project>

请让我知道。预先谢谢你

1 个答案:

答案 0 :(得分:2)

此处的关键问题是将"identity": "UserFromRequest"与计时器触发器一起使用。 HttpTrigger仅支持该身份模式,因为它会从HTTP请求中提取请求信息。

对于计时器驱动的方案,身份的两个最佳选择是clientCredentialsuserFromIdclientCredentials在这种情况下可能不是您想要的,因为您正在访问Graph资源,并且函数应用程序的服务主体可能在图中没有任何有趣的东西。

要使用userFromId身份模式,您需要执行以下操作:

  1. 通过将"userId":"<principalId>"添加到您的function.json中为用户指定主体ID
  2. 确保上面指定的用户已登录到功能应用程序。这可以通过让用户直接在https://<function-app-name>.azurewebsites.net/.auth/login/aad上登录自己或让客户端通过以下主体向上述URL发出POST请求来实现(注意:所有令牌都具有功能应用程序的访问者):

{ "id_token": "<idToken>", "access_token": "<accessToken>", "refresh_token": "<refreshToken>" }