我有一个使用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>
请让我知道。预先谢谢你
答案 0 :(得分:2)
此处的关键问题是将"identity": "UserFromRequest"
与计时器触发器一起使用。 HttpTrigger仅支持该身份模式,因为它会从HTTP请求中提取请求信息。
对于计时器驱动的方案,身份的两个最佳选择是clientCredentials
或userFromId
。 clientCredentials
在这种情况下可能不是您想要的,因为您正在访问Graph资源,并且函数应用程序的服务主体可能在图中没有任何有趣的东西。
要使用userFromId
身份模式,您需要执行以下操作:
"userId":"<principalId>"
添加到您的function.json
中为用户指定主体ID https://<function-app-name>.azurewebsites.net/.auth/login/aad
上登录自己或让客户端通过以下主体向上述URL发出POST请求来实现(注意:所有令牌都具有功能应用程序的访问者): { "id_token": "<idToken>", "access_token": "<accessToken>", "refresh_token": "<refreshToken>" }