Таймер функций Azure с Graph Api

У меня есть функции таймера (бета-версия / v2) с использованием Graph Api. но я получаю следующую ошибку.

Теперь я получаю эту ошибку:

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>

Пожалуйста, дай мне знать. заранее спасибо


person Filippo    schedule 22.10.2018    source источник
comment
Вы можете просмотреть следующую ссылку для справки: docs.microsoft.com/en-us/azure/azure-functions/   -  person Yuki    schedule 23.10.2018
comment
Привет, из функций таймера Azure, как мне получить доступ к Microsoft Graph (graph.microsoft.com), чтобы получить информацию о календаре пользователя?   -  person Filippo    schedule 23.10.2018


Ответы (1)


Ключевой проблемой здесь является использование "identity": "UserFromRequest" с триггером таймера. Этот режим идентификации поддерживается только с HttpTrigger, поскольку он извлекает информацию о запросе из HTTP-запроса.

Для сценариев, управляемых таймером, два лучших варианта идентификации - clientCredentials или userFromId. clientCredentials, вероятно, не то, что вам нужно в этом случае, поскольку вы обращаетесь к ресурсам Graph, а принципал службы вашего приложения-функции, вероятно, не имеет ничего интересного на графике.

Чтобы использовать режим идентификации userFromId, вам необходимо сделать следующее:

  1. Укажите основной идентификатор пользователя, добавив "userId":"<principalId>" в свой function.json
  2. Убедитесь, что указанный выше пользователь вошел в приложение-функцию. Это может быть выполнено путем прямого входа пользователя в систему на https://<function-app-name>.azurewebsites.net/.auth/login/aad или путем выполнения клиентом запроса POST по указанному выше URL-адресу с нижеследующим телом (ПРИМЕЧАНИЕ: все токены имеют аудиторию приложения-функции):

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

person Connor McMahon    schedule 23.10.2018
comment
Привет @connor, большое спасибо за вашу помощь. Я пытаюсь получить каждого малыша. время определенных данных о пользователе, получающем доступ через Graph API, и сохранять их в БД. Это должно происходить без какого-либо взаимодействия с пользователем. Если необходимы определенные учетные данные для входа, их следует интегрировать, возможно, в файл json, чтобы сделать это автоматически. - person Filippo; 24.10.2018