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

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

0 голосов
/ 22 октября 2018

У меня есть функции таймера (бета-версия / 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>

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

1 Ответ

0 голосов
/ 23 октября 2018

Ключевой проблемой здесь является использование "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>" }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...