Мой azure Http Trigger при ошибке, потому что это не asyn c. Почему мой метод не asyn c? - PullRequest
1 голос
/ 09 апреля 2020

Я новичок в azure и изучаю, как использовать HTTP Trigger. Я написал простую функцию, которую я запускаю локально, используя azure эмулятор хранилища

public static class Function1
    {
        [FunctionName("PutRecipeInCosmos")]
        public static async Task<HttpResponseMessage> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] 
            HttpRequestMessage req, ILogger log)
        {
            return await Task.FromResult(req.CreateResponse(System.Net.HttpStatusCode.OK, "Hey!"));
        }
    }

Когда я нажимаю на эту функцию, это почтальон, консоль azure возвращает следующую ошибку:

Microsoft.AspNetCore.Server.Kestrel.Core: Synchronous operations are disallowed. Call WriteAsync or set AllowSynchronousIO to true instead.

Мой метод помечен как asyn c и включает в себя ожидание возврата. Почему я вижу эту ошибку?

**** ОБНОВЛЕНИЕ ****

Я исправил это, возвращая возвращаемый OKObjectResult вместо HttpResonseMesssage. Похоже, что HttpRequestMessage.Create является синхронным вводом-выводом и не может обрабатываться асинхронно?

public static class Function1
    {
        [FunctionName("PutRecipeInCosmos")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] 
            HttpRequestMessage req, ILogger log)
        {
            return new OkObjectResult("Hey!");
        }
    }

1 Ответ

0 голосов
/ 10 апреля 2020

РЕДАКТИРОВАТЬ:

установить следующие пакеты NuGet:

Microsoft. Azure .Functions.Extensions Microsoft. NET .Sdk.Functions версия 1.0.28 или новее

затем добавьте новый класс запуска со следующим содержимым:

using System;
using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Http;
using Microsoft.Extensions.Logging;

[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]

namespace MyNamespace
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
          builder.Services.Configure<KestrelServerOptions>(options =>
          {
              options.AllowSynchronousIO = true;
          });

          // If using IIS:
          builder.Services.Configure<IISServerOptions>(options =>
          {
              options.AllowSynchronousIO = true;
          });
        }
    }
}
...