首页 > 解决方案 > 如何序列化/反序列化客户端库的 dotnet 核心异常?

问题描述

在 dotnet core v3 和 v5 中,我注意到我无法成功序列化异常。如果我尝试我得到这个

在此处输入图像描述

这是由于System.TypeTargetSite.DeclaryingType 属性。这是在 v5 中,但在 v3 中,序列化只是爆炸了,因为它达到了 32 的最大深度(并且增加到 128 个作品,但仍然具有奇怪的周期性行为)。

我的情况似乎很简单。我有一个应用程序异常FooNotFoundException,我想在我的控制器中捕获和处理,例如:

public IActionResult Test()
{
    try 
    {
        // try to do something
    }
    catch(FooNotFoundException e)
    {
        return NotFound(e);
    }
}

然后我有一个客户端库,我想基本上查找此端点的状态代码 404,然后反序列化为此异常类型,以便消费者在调用此端点时也可以处理此异常。在我看来,这似乎非常直接并且受到追捧,所以我很震惊地无法找到任何关于如何正确序列化和反序列化这样的基本Exception跨网络边界的本机 MS 文档,而无需完全实现对自定义的翻译DTO。

好奇是否有人在 .NET Core v3 或 v5 中找到了一种优雅的方法来执行此操作?

标签: c#asp.net-core

解决方案


我在评论中输入了这个,但它不适合......

如果一些基本信息,如消息、帮助链接、.. 是一些想要的东西,.. 建立我们自己的响应标准怎么样?...像这样

// On some upper middleware catching exceptions
if (_environment.IsDevelopment())
            {
                var exceptionDetail = new Dictionary<string, string>()
                {
                    {"Type", exception.GetType().ToString()},
                    {"Message", exception.Message},
                    {"StackTrace", exception.StackTrace}
                };
                foreach (DictionaryEntry data in exception.Data)
                    exceptionDetail.TryAdd(data.Key.ToString(), data.Value?.ToString());
                responseResult.Error.ExceptionDetail = exceptionDetail;
            }

            return context.Response.WriteAsync(JsonConvert.SerializeObject(responseResult,
                new JsonSerializerSettings()
                {
                    ContractResolver = new CamelCasePropertyNamesContractResolver()
                }));

我认为它足够紧凑,可以让像 spa 这样的客户处理一些细节


推荐阅读