Ошибка График таймера функций Azure

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

Что мне не хватает? Пожалуйста, дайте мне знать. @ Джерри Лю, ты можешь знать ответ;)

Ошибка получена:

2018-08-10T13: 36: 17 Добро пожаловать, теперь вы подключены к службе потоковой передачи журналов. 2018-08-10T13:37:17 Никаких новых следов за последние 1 мин. 2018-08-10T13:37:23.958 [Информация] Сценарий для функции "TimerTriggerMeetingRoom" изменен. Перегрузочный. 2018-08-10T13:37:30.447 [Ошибка] run.csx(40,6): ошибка CS1997: поскольку "Run(TimerInfo, string, ILogger)" является асинхронным методом, который возвращает "Task", ключевое слово return не должно сопровождаться выражением объекта. Вы намеревались вернуть "Задачу"? 2018-08-10T13:37:30.548 [Информация] Компиляция не удалась.

This is my "run.csx" code:
#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 ответ

Похоже, это ваша проблема: [Error] run.csx(99,5): error CS1997: Since 'Run(TimerInfo, string, ILogger)' is an async method that returns 'Task', a return keyword must not be followed by an object expression. Did you intend to return 'Task'?

Обратите внимание, что в трассировке стека исключений есть "ошибка компиляции скрипта" и вышеприведенная ошибка, которая более конкретно вызывает ошибку в коде вашей функции.

Я бы изменил подпись вашего метода на public static async void Run(...)и удалите возвращение нового HttpResponseMessage (предположительно в строке 99). Просто return; было бы лучше для функции, запускаемой по таймеру, так как я не вижу вывода HTTP, имеющего смысл в этом контексте.

Другие вопросы по тегам