gpt4 book ai didi

c# - 通过 HTTP 调用 Azure Function 150 次导致异常

转载 作者:太空狗 更新时间:2023-10-30 01:30:04 25 4
gpt4 key购买 nike

我在 Azure 上运行一个 asp.net mvc Web 应用程序。在一种方法中,我对 Azure Function Web API 进行了多次 HTTP 调用。在此 Azure 函数中,我使用 DbContext 将新记录插入数据库。

// Method in web application making http requests to azure function web api
public async Task CreateRecords() {
int amountOfCalls = 150;
var allTasks = new List<Task<HttpResponseMessage>>();

for (int i = 0; i < amountOfCalls; i++) {
var task = HttpClientInstance.Instance.PostAsync(<uri>, new StringContent(i.ToString()));
allTasks.Add(task);
}

await Task.WhenAll(allTasks); // Gives an exception
}

amountOfCalls 设置为 25、50 或 100 时,一切正常。但是,当我将 amountOfCalls 设置为 150 时,最初它会将一些记录插入数据库,但最终会导致错误:

Unable to connect to the remote server.

所以首先我认为它必须与 Azure sql 数据库的最大并发登录有关。所以我将那个升级到定价层 S9(1600 个 DTU,最多 3200 个并发登录记录 here)。

但这并没有解决问题。于是我开始远程调试 Azure Function。并且它不会在 Azure Functions 本身中给出异常。所以下一步是研究 Application Insights。我看到 DbContext 的构造函数给出了一个异常(不幸的是没有堆栈跟踪):

type: System.InvalidOperationException

method: WebApp.DataAccess.PocDbContext..ctor

requestName: InsertRecordFunction

requestDuration: 55,643.2201

Azure 函数如下所示:

[DependencyInjectionConfig(typeof(DependencyConfig))] // Autofac
public static class InsertRecordFunction
{
[FunctionName("InsertRecordFunction")]
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "post", Route = "InsertRecordFunction")]HttpRequestMessage req,
TraceWriter log,
[Inject]IRecordDataService recordDataService)
{
log.Info("InsertRecordFunction was triggered by Http.");
try {
await recordDataService.AddRandomRecordAsync();
}
catch (Exception ex) {
return req.CreateErrorResponse(HttpStatusCode.InternalServerError, ex);
}

return req.CreateResponse(HttpStatusCode.OK);
}

PocDbContext 的构造函数如下所示:

public PocDbContext() : base("DefaultConnection") {
Database.SetInitializer<PocDbContext>(null);
}

我还是觉得跟Azure sql数据库的连接池有关系。在这个问题之前,我遇到了另一个告诉我将执行策略设置为 SqlAzureExecutionStrategy (我做到了 this way )。

使用(静态)HttpClient 的 Azure Web 应用程序的 Web API 调用是否存在某种最大值?我还能做些什么来找出确切的异常是什么?谢谢。

更新

在 Application Insights 中,我找到了有关该异常的更多信息:

Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.

升级 Azure sql 数据库的定价层后,这不是我所期望的。

最佳答案

来自支持 Entity Framework 的 ADO.NET 文档 (SQL Server Connection Pooling (ADO.NET)):

By default, connection pooling is enabled in ADO.NET. Unless you explicitly disable it, the pooler optimizes the connections as they are opened and closed in your application.

再往下一点 Adding Connections部分:

Connections are added to the pool as needed, up to the maximum pool size specified (100 is the default).

因此,将连接字符串的最大池大小显式设置为 >= 150 应该可以解决问题。

关于c# - 通过 HTTP 调用 Azure Function 150 次导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47805186/

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