部署后 Azure 函数 .net 6 return 错误 500
Azure function .net 6 return error 500 after deploy
我已经将一个项目从 .net core 3.1 迁移到 .net 6.0。我有 resolved/updated 所有 nugets,我的函数在本地环境中运行良好(我在两台电脑上测试过)。该项目有一个 http 触发器和到数据库的连接。当我使用邮递员调用 api 并且在逻辑上不需要连接到数据库时,我的函数 return 200 关于 http 状态代码和预期的响应正文。但是,当函数需要连接到数据库时,我在日志中看到函数从数据库获取结果,尽管当函数 return 响应 return 错误 500 时所有逻辑运行良好。
任何关于异常的日志都显示在 azure 函数日志上,我也在 kudu 上搜索数据应用程序日志文件,但我没有找到与该问题相关的任何内容
Azure 日志(红色数据是从数据库中检索的)
邮递员
项目配置
Nugets
项目
Azure 函数属性
FUNCTIONS_EXTENSION_VERSION: ~4
运行时版本:~4
FUNCTIONS_WORKER_RUNTIME: 网络
Azure 函数代码
[FunctionName("FnDealSlip")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "v1/fintech/dealslip")] HttpRequest req,
ILogger log)
{
string offerDate = req.Query["offerDate"];
try
{
return await Invoke(req, log, (request, logger) =>
{
return _dealSlipService.GetDealSlipByOfferDate(offerDate);
},
(response, httpRequest, logger) =>
{
log.LogInformation("Response: " + JsonFormartter.Serialize(response));
log.LogInformation("Response Status Code: " + JsonFormartter.Serialize(response.StatusCode));
var actionResponse = new ObjectResult(response)
{
StatusCode = response.StatusCode
};
log.LogInformation("Response actionResponseSet: true ");
return actionResponse;
});
}
catch (Exception ex)
{
log.LogError("error fn: " + ex.Message);
throw;
}
}
- 因为 HTTP 函数需要 return HTTP 结果,请考虑将其更改为:
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req,
ILogger log)
{
// your code goes here
return req.CreateResponse(HttpStatusCode.OK, "Done");
- 500 个内部错误甚至在我们的代码执行之前就发生了。当使用HTTP函数的客户端return出现500错误时,实际的HTTP Trigger函数并没有异常。
- 还值得注意的是,当出现500错误时,No Single function works。结果,所有 HTTP 函数同时开始 returning 500 状态代码。其中 none 似乎正在记录任何内容。
- 你已经检查过你的代码在本地工作,但是当你将它发布到 Azure 函数时,你会收到 500 错误。在那种情况下,您的 local.setting.json that was not created in the azure function under the application setting.
中似乎有一些配置
- 我还建议查看 Azure Functions diagnostics 以找出导致 500 问题的原因。
我发现了错误。将 .Net core 3.1 迁移到 .Net 6 后,出现了一些考虑因素:
- 建议 Azure 函数不共享 azure 帐户
- 如果不同的 Azure 函数共享同一个存储帐户,其名称必须是唯一的
错误是,link 用于存储帐户的 azure 函数的标识符是前 26 个字符,因此,我有不同的 azure 函数共享同一个存储帐户并且其名称长于 26 个字符,因为 link 刚拿了前 26 个,这引起了标识符的口是心非。
解决方案:在 Azure 配置设置上为每个函数定义一个自定义 hostid。例如
AzureFunctionsWebHost__hostId=mycustomfunctionname
更多详情
https://github.com/Azure/azure-functions-host/wiki/Host-IDs#host-id-collisions
我已经将一个项目从 .net core 3.1 迁移到 .net 6.0。我有 resolved/updated 所有 nugets,我的函数在本地环境中运行良好(我在两台电脑上测试过)。该项目有一个 http 触发器和到数据库的连接。当我使用邮递员调用 api 并且在逻辑上不需要连接到数据库时,我的函数 return 200 关于 http 状态代码和预期的响应正文。但是,当函数需要连接到数据库时,我在日志中看到函数从数据库获取结果,尽管当函数 return 响应 return 错误 500 时所有逻辑运行良好。
任何关于异常的日志都显示在 azure 函数日志上,我也在 kudu 上搜索数据应用程序日志文件,但我没有找到与该问题相关的任何内容
Azure 日志(红色数据是从数据库中检索的)
邮递员
项目配置
Nugets
项目
Azure 函数属性
FUNCTIONS_EXTENSION_VERSION: ~4
运行时版本:~4
FUNCTIONS_WORKER_RUNTIME: 网络
Azure 函数代码
[FunctionName("FnDealSlip")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", Route = "v1/fintech/dealslip")] HttpRequest req,
ILogger log)
{
string offerDate = req.Query["offerDate"];
try
{
return await Invoke(req, log, (request, logger) =>
{
return _dealSlipService.GetDealSlipByOfferDate(offerDate);
},
(response, httpRequest, logger) =>
{
log.LogInformation("Response: " + JsonFormartter.Serialize(response));
log.LogInformation("Response Status Code: " + JsonFormartter.Serialize(response.StatusCode));
var actionResponse = new ObjectResult(response)
{
StatusCode = response.StatusCode
};
log.LogInformation("Response actionResponseSet: true ");
return actionResponse;
});
}
catch (Exception ex)
{
log.LogError("error fn: " + ex.Message);
throw;
}
}
- 因为 HTTP 函数需要 return HTTP 结果,请考虑将其更改为:
public static async Task<HttpResponseMessage> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequestMessage req,
ILogger log)
{
// your code goes here
return req.CreateResponse(HttpStatusCode.OK, "Done");
- 500 个内部错误甚至在我们的代码执行之前就发生了。当使用HTTP函数的客户端return出现500错误时,实际的HTTP Trigger函数并没有异常。
- 还值得注意的是,当出现500错误时,No Single function works。结果,所有 HTTP 函数同时开始 returning 500 状态代码。其中 none 似乎正在记录任何内容。
- 你已经检查过你的代码在本地工作,但是当你将它发布到 Azure 函数时,你会收到 500 错误。在那种情况下,您的 local.setting.json that was not created in the azure function under the application setting. 中似乎有一些配置
- 我还建议查看 Azure Functions diagnostics 以找出导致 500 问题的原因。
我发现了错误。将 .Net core 3.1 迁移到 .Net 6 后,出现了一些考虑因素:
- 建议 Azure 函数不共享 azure 帐户
- 如果不同的 Azure 函数共享同一个存储帐户,其名称必须是唯一的
错误是,link 用于存储帐户的 azure 函数的标识符是前 26 个字符,因此,我有不同的 azure 函数共享同一个存储帐户并且其名称长于 26 个字符,因为 link 刚拿了前 26 个,这引起了标识符的口是心非。
解决方案:在 Azure 配置设置上为每个函数定义一个自定义 hostid。例如
AzureFunctionsWebHost__hostId=mycustomfunctionname
更多详情 https://github.com/Azure/azure-functions-host/wiki/Host-IDs#host-id-collisions