gpt4 book ai didi

c# - Azure Functions 不允许同步操作 为什么?

转载 作者:行者123 更新时间:2023-12-03 23:48:46 26 4
gpt4 key购买 nike

我正在 Azure Functions 中处理两个函数

定时器函数Http触发函数

我的计时器函数每 1 小时运行一次,它通过 Http 客户端执行 http 函数。

现在我确实收到错误不允许同步操作

我知道如何使用article解决这个问题堆栈溢出

但是我很好奇为什么我会收到此错误?

这是什么原因造成的?

使用Postman时不会出现该错误。

我的计时器代码

Azure Functions Core Tools (3.0.2245 Commit hash: 1d094e2f3ef79b9a478a1621ea7ec3f93ac1910d)
Function Runtime Version: 3.0.13139.0

Host configuration file read:
{
"version": "2.0"
}
public static class DoSomeStuffTimer
{
[FunctionName("DoSomeStuffTimer")]
public static void Run([TimerTrigger("0 0 7 * * *")]TimerInfo myTimer, ILogger log)
{
try
{
log.LogInformation($"C# DoSomeStuffTimer executing at: {DateTime.Now}");
string url = Environment.GetEnvironmentVariable(EnvironmentKey.HostKey) + "/api/DoSomeStuff";
HttpClient client = new HttpClient();
client.PostAsJsonAsync(url, new DoSomeStuffRequest());
log.LogInformation($"C# DoSomeStuffTimer executed at: {DateTime.Now}");
}
catch (Exception e)
{
log.LogInformation(e.ToString());
}
}
}

我的Http代码

public class DoSomeStuffFunction
{
[FunctionName("DoSomeStuffFunction")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = "DoSomeStuff")]
HttpRequestMessage req,
ILogger log)
{
var response = new ContentResult {ContentType = "application/json", StatusCode = 200};

try
{
DoSomeStuffRequest
request = req.Content.ReadAsAsync<DoSomeStuffRequest>().Result;
}
catch (Exception e)
{
log.LogInformation(e.ToString());
}
}
}

最佳答案

从 ASP.NET Core 3.0 开始 synchronous calls are disabled by default因此,任何在 3.0 上运行的函数在尝试进行同步调用时都会遇到这种情况

我调查了它,发现它发生在你的函数中的原因是 ReadAsAsync<>()它的操作中的某个地方同步执行某些操作。我不确定为什么它会这样做,或者为什么当你直接调用 httptrigger 时它不会中断。这需要做更多的工作才能弄清楚。

让你的代码在没有 FUNCTIONS_V2_COMPATIBILITY_MODE 的情况下工作设置为True您可以使用其他读取器之一,例如 ReadAsStreamAsync()。

下面你可以找到有效的方法(我在本地测试过)。但是,我不建议您直接在函数应用程序中调用另一个函数,而是遵循recommendations by Microsoft或者创建一个包含两个函数可以独立调用的逻辑的抽象。

public class DoSomeStuffFunction
{
[FunctionName("DoSomeStuffFunction")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = "DoSomeStuff")]
HttpRequestMessage req,
ILogger log)
{
var response = new ContentResult { ContentType = "application/json", StatusCode = 200 };

try
{
var request = await req.Content.ReadAsStreamAsync();
using (StreamReader rd = new StreamReader(request))
{
var result = JsonConvert.DeserializeObject<DoSomeStuffRequest>(await rd.ReadToEndAsync()).;
}

return new OkObjectResult(response);
}
catch (Exception e)
{
log.LogInformation(e.ToString());
return new BadRequestObjectResult("It went wrong");
}
}
}

关于c# - Azure Functions 不允许同步操作 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60751230/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com