【发布时间】:2020-01-07 13:07:30
【问题描述】:
我的任务是在 .NET Core 2.1+ 中使用 Azure Functions 创建 REST API,但我担心死锁。我们将有一个现场方使用 JavaScript 框架调用 POST 请求的 API,以及其他发出 POST 请求并以其他方式使用它的场外方。 Stephen Cleary 在这里说 - Is .GetAwaiter().GetResult(); safe for general use? - Azure 函数总是在没有上下文的情况下运行代码。 Stephen 在这里说 - https://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html - ASP.NET Core 应用程序不使用与旧版 ASP.NET 相同的 SynchronizationContext。他说阻塞异步代码不会死锁,因为它运行在线程池线程上,所以没有理由使用 ConfigureAwait(false)。但是,如果您正在编写在非 ASP.NET Core 应用程序中重用的核心库,则应该使用 ConfigureAwait(false)。由于 Azure 基于函数的 REST API 没有上下文并且是独立的,是否需要使用 ConfigureAwait(false) 来防止死锁?
编辑:我的代码如下所示:
private readonly ILogger<AzureMockFunctions> _logger;
public AzureMockFunctions(ILogger<AzureMockFunctions> logger)
{
_logger = logger;
}
[FunctionName("Function")]
public Task<ActionResult<Teacher>> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "null")] HttpRequest request)
{
try
{
_logger.LogInformation("C# HTTP trigger function processed a request.");
using (StreamReader reader = new StreamReader(request.Body, Encoding.UTF8))
{
string requestBody = reader.ReadToEndAsync().GetAwaiter().GetResult();
Teacher data = JsonConvert.DeserializeObject<Teacher>(requestBody);
if (data == null)
throw new Exception("request body is empty");
}
Teacher teacher = new Teacher
{
prop1 = "some string",
prop2 = "1",
prop3 = "some other string"
};
return Teacher;
}
catch (Exception ex)
{
_logger.LogError($"An error occurred: {ex}");
return new BadRequestObjectResult(new
{
message = "An error occurred: " + ex.Message
});
}
}
public class Teacher
{
public string prop1{ get; set; }
public string prop2{ get; set; }
public string prop3{ get; set; }
}
【问题讨论】:
-
分享你的请求码sn-p。
-
ASP.NET Core 没有
SynchronizationContext。如果你在 ASP.NET Core 上,不管你是否使用ConfigureAwait(false)。 -
Stephen Cleary 在他的博客(第二个链接)上说——“我仍然建议你在核心库中使用它——任何可以在其他应用程序中重用的东西。如果你的库中有代码也可以在 UI 应用程序、旧版 ASP.NET 应用程序或任何其他可能存在上下文的地方运行,那么您仍应在该库中使用 ConfigureAwait(false)。”这是我的问题 - 由于我的基于 .NET Core 的 Azure 函数/REST API 被其他可能使用上下文的应用程序使用,我是否需要将 ConfigureAwait(false) 添加到我的异步代码中?
标签: c# rest async-await azure-functions