处理的StorageException之后,Azure Function v2始终返回内部服务器错误500

炸弹

假设您有一个使用表存储的Azure函数(v2),可以运行,但是存在SomePartitionKey / SomeRowKey的实体存在(例如,您两次运行以下内容):

[FunctionName("SomeEntity")]
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "someentity")] HttpRequest req,
                                            [Table("SomeEntities")] IAsyncCollector<SomeEntity> collector,
                                            ILogger logger)
{

    try
    {
        SomeEntity se = new SomeEntity()
        {
                PartitionKey = "SomePartitionKey",
                RowKey = "SomeRowKey"
        };
        await collector.AddAsync(se);
        await collector.FlushAsync();

        return new OkResult();
    }
    catch (Microsoft.WindowsAzure.Storage.StorageException e)
    {
        logger.LogError("There was an error processing the request.", e);
        return new StatusCodeResult(409);
    }
}

当此方法运行并且该实体已经存在时,如预期的那样,它将引发StorageException。我的问题是,即使我捕获到异常并尝试返回StatusCodeResult(409)实际发送给客户端的响应,始终是内部服务器错误(500)。

我的问题是:
a)这是否是函数的清除逻辑尝试FlushAsync()再次在收集器上调用的结果,导致未处理的StorageException导致内部服务器错误(500)。b)如果a)是,是否可以防止这种情况?
c)除了首先检查实体是否存在之外,此场景是否有最佳实践?

斯蒂芬·克莱里

关于Azure Functions NuGet软件包的一大优点是它们启用了源链接。确保已Enable Source Link support签入Visual Studio选项,并且您将能够准确看到他们的代码在做什么。一旦功能应用程序运行,您就可以选择在引发任何CLR异常时中断。

如果执行此操作,您将看到异常从抛出FlushAsync,您的代码正在捕获该异常,并返回409结果。然后,在函数返回之后,将再次引发相同的异常(因为FlushAsync在函数外部再次调用了该异常),并捕获了该异常Error while handling parameter collector after function returned,并在message中引发了包装异常,而该异常又被捕获,并在消息中引发了包装异常Exception while executing function: SomeEntity,而该错误又被捕获,并且只会向客户端返回一个简单的旧500错误。

所以:

a)这是否是该函数的清理逻辑的结果,该逻辑试图再次在收集器上调用FlushAsync(),导致未处理的StorageException导致内部服务器错误(500)。

是。如果启用“源链接”支持和“抛出时断开”,则可以直接通过Azure Functions运行时进行调试,并观察到这种情况。

b)如果a)是,是否可以防止这种情况?

c)除了首先检查实体是否存在之外,此场景是否有最佳实践?

建议先检查然后插入。您最终将面临比赛条件。

文档

此输出绑定不支持更新现有实体。使用TableOperation.ReplaceAzure存储SDK中操作来更新现有实体。

通常,任何给定服务的Azure Functions绑定都是针对简单用例的。对于Azure存储表,简单的用例只是插入实体。

但是,您始终可以自己使用Storage SDK。无论如何,这几乎就是绑定为您所做的。该绑定也进行了一些批处理,但是如果需要的话,实现起来并不难。

您还可以执行“半路”:将Tables绑定绑定到CloudTable而不是IAsyncCollector<SomeEntity>这样,您将自动使用适当的连接字符串。您只需要编写自己的TableOperation.InsertOrReplace代码即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

SocketException中的Azure Function Proxy内部服务器错误500

Azure Function v2 Web Deploy遇到服务器连接问题,必须终止连接

Azure 存储模拟器返回 500 内部服务器错误

使用HttpClient处理500(内部服务器错误)

Azure Functions Python 状态:500 内部服务器错误

Azure 函数状态代码 500 内部服务器错误

我如何找出导致Azure B2C 500内部服务器错误的原因?

Google Cloud Storage JSON API:批处理删除返回未知错误(500内部服务器错误)

Azure Function V2服务总线消息延迟

内部服务器错误500-托管Microsoft Bot Framework的Azure应用服务

如何在 500 个内部服务器错误 angularjs 之后/何时获得发布响应

当尝试在Azure Data Factory V2中添加动态文件名(链接服务器)时遇到错误

加载资源失败:服务器响应状态为500(内部服务器错误)Azure MVC

如何处理对弹簧安置API内部服务器错误(500)?

在 R 地理编码函数中处理 500 内部服务器错误

内部服务器错误 500 仅针对 Azure Functions 中大量数据的请求

Azure Function v2 .NET框架?

Azure 上的 Node Js RestFull API,返回 HTTP 错误 500.1001 - 内部服务器错误

Visual Studio 2017-部署到Azure Function v2(.NetCore v2.1)错误:所需的进程(“ Web管理服务”)已启动

AWS未处理的异常lambda函数返回:内部服务器错误

从Azure App Service Plan中的ASP.NET MVC操作返回内部服务器错误

Azure Function v2 队列触发器仅接收 Json 消息

尝试调用包装在Docker容器中的Azure函数时发生内部服务器错误(500)

Microsoft.WindowsAzure.Storage.StorageException:'远程服务器返回错误:(400)错误的请求

内部Azure AKS API服务器未返回证书

Webmin/Virtualmin - 处理大文件 - 内部服务器错误

如何使用 Android WebView 处理“内部服务器错误”?

Azure Function V2值不能为空

分段数据上传-Azure Function V2