将带有 NodaTime 自动道具的模型发布到 WebAPI

2023-12-13

我们正在项目中使用 NodaTime 作为时间/日期模型。该项目是一个Web应用程序,使用WebAPI。当尝试发布包含 LocalTime autoprops 的模型时,我们收到 InsufficientExecutionStackException。

为了将我们的项目与此问题隔离,我创建了一个新的 WebAPI 项目。使用 NuGet,我将 NodaTime 和 NodaTime.Serialization.JsonNet 添加到项目中。在Startup.cs, 我用了ConfigureForNodaTime像这样:

GlobalConfiguration.Configure(x =>
{
    x.Formatters.XmlFormatter.SupportedMediaTypes.Clear();
    x.Formatters.JsonFormatter.SerializerSettings.ConfigureForNodaTime(
    DateTimeZoneProviders.Tzdb);
});

在(样板文件)中ValuesController.cs文件,我劫持了Post像这样:

// POST api/values
public void Post(TestClass input)
{
    var x = input;
}

public class TestClass
{
    public LocalTime Open { get; set; }
    public LocalTime Close { get; set; }
}

当发布此输入模型(通过邮递员)时,我没有接收当地时间,而是在本文末尾收到错误。

如果我们重写TestClass如图所示,没有发生错误,我们得到了正确的当地时间:

public class TestClass
{
    public LocalTime;
    public LocalTime;
}

我可以做些什么来让应用程序与 autoprops 一起使用吗?虽然我可以(并且可能会)开始用字段替换 autoprops,但了解这里发生的情况会很高兴。

这是整个错误,从中间删除了 800 行任意行:

{
"message":"An error has occurred.",
"exceptionMessage":"Insufficient stack to continue executing the program safely. This can happen from having too many functions on the call stack or function on the stack using too much stack space.",
"exceptionType":"System.InsufficientExecutionStackException",
"stackTrace":"   at System.Runtime.CompilerServices.RuntimeHelpers.EnsureSufficientExecutionStack()
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateElements(IEnumerable model, ValidationContext validationContext)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
    at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, IEnumerable`1 validators)
    at System.Web.Http.Validation.DefaultBodyModelValidator.Validate(Object model, Type type, ModelMetadataProvider metadataProvider, HttpActionContext actionContext, String keyPrefix)
    at System.Web.Http.ModelBinding.FormatterParameterBinding.<ExecuteBindingAsyncCore>d__0.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
    at System.Web.Http.Controllers.HttpActionBinding.<ExecuteBindingAsyncCore>d__0.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult()
    at System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
    at System.Web.Http.Filters.AuthorizationFilterAttribute.<ExecuteAuthorizationFilterAsyncCore>d__2.MoveNext()
    --- End of stack trace from previous location where exception was thrown ---
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
    at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
    at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__0.MoveNext()"
}

这似乎是一个WebAPI问题,但我不完全理解根本原因,也不是特别喜欢这个解决方案。然而,基于这个答案中的代码,我想出了一个解决方法:

public class CustomBodyModelValidator : DefaultBodyModelValidator
{
    public override bool ShouldValidateType(Type type)
    {
        return type.Namespace != "NodaTime" && base.ShouldValidateType(type);
    }
}

在您的配置 lambda 中(或在您访问全局 WebAPI 配置的任何位置):

x.Services.Replace(typeof(IBodyModelValidator), new CustomBodyModelValidator());

在我(或其他人)找到更好的解决方案之前,请将此视为一种解决方法。谢谢。

Update:经过进一步研究,这似乎已经发布到 Noda Time 问题跟踪器中,如下所示问题#249,并提出了类似的解决方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将带有 NodaTime 自动道具的模型发布到 WebAPI 的相关文章

随机推荐

  • 单击菜单标题时连接函数

    我正在尝试找到开放的端口并将它们添加到我的菜单中 现在 我成功地对菜单执行了一个操作 例如 查找端口 并且只有单击它时 它才会连接到获取所有可用端口的函数 不幸的是 这不是我想要的 我想点击菜单title 并获取我的菜单中的所有端口 下面是
  • 从数值向量获取类别

    我有这个数字向量 vec lt 1 7 如何使用这些逻辑规则将其转换为 3 类 if vec gt 1 vec lt 4 then category1 else if vec gt 4 vec lt 6 then category2 els
  • 具有 Azure AD B2C 和单点登录的 MSAL

    我正在开发一个带有几个 Angular 4 SPA 的系统 每个 SPA 都与一个单独的 Asp NET Core 2 0 WebAPI 进行通信 Azure AD B2C 用作每个 SPA API 的身份服务 MSAL js 用作我们 A
  • 如何获取网络接口及其正确的 IPv4 地址?

    我需要知道如何获取所有网络接口及其IPv4地址 或者只是无线和以太网 要获取所有网络接口详细信息 我使用以下命令 foreach NetworkInterface ni in NetworkInterface GetAllNetworkIn
  • 我需要什么样的加盟?

    我有一个投票表 votes userid gameid a 1 a 2 a 3 b 1 b 2 和一张游戏桌 games gameid title 1 foo 2 bar 3 fizz 4 buzz 我将使用哪种联接来执行查询 从 用户 A
  • SonarQube MSBuild 无法排除文件

    我正在 debian 上使用 msbuild 运行分析 使用以下命令 mono msbuild SonarQube Scanner MSBuild exe begin d sonar login
  • Maven war/jar 大小太大

    我正在构建一个项目 其中最终的战争 罐子大小非常大 我不知道如何减小罐子的大小 如何只构建项目所需的jar 目前我们只是在依赖项中给出了 maven 构建插件 并在顶部给出了构建 war 或 jar 的工件 id 请指教 Thanks 在您
  • Redis 数据库 TTL

    无论如何 有没有办法创建一个 Redis 数据库 其中键HAVE TO一定时间后会过期吗 我知道我可以使用以下命令使单个密钥过期EXPIRE命令 但由于无论如何我都会在一定时间后使每个密钥过期 因此最好在 Redis 配置文件中指定此行为
  • Java如何计算时差

    如果用户输入是 2255 和 2305 我如何计算 24 小时内的时间差 输出应该是 10 分钟 我的一个想法是将输入分成两部分 2 位数字和 2 位数字 前 2 位数字是小时 乘以 60 即可得到分钟 然后加上后2位数字 然后计算差值 我
  • R - 查找数据框子集中的所有唯一值

    我有一个包含两列的数据框 第一列定义数据的子集 我想找到第二列中仅出现在第一列的一个子集中的所有值 例如 来自 df data frame data subsets rep LETTERS 1 2 each 5 data values c
  • ViewPager2 selectCurrentItem - 选择选项卡,但在此选项卡内放置错误的片段

    我有基本的 ViewPager2 和 Tablayout 在每个页面中我都有不同的片段 当我需要不从第一个 默认 选项卡打开此视图时 我正在这样做 viewPager currentItem selectedTabPosition 此代码选
  • 如何在 iPhone 上验证从网络下载的图像文件?

    我正在使用 NSURLConnection sendSynchronousRequest 方法下载图像 效果很好 但是 有时我会遇到图像 URL 指向图像文件以外的其他内容的问题 例如 我发现这个非图像 URL 导致了问题 http www
  • 输入参数未定义 - MATLAB 函数/子函数

    我正在 MATLAB 中测试函数的一部分 我定义了一个函数和子函数如下 仅用于测试 function funct clear all clc I rand 11 11 ld input Enter the lag prompt for la
  • Zend Framework - JQuery - 日期选择器 - 将日期格式设置为 YYYY-mm-dd

    我在基于 Zend Framework 的应用程序表单中使用 JQuery DatePicker 这是日期选择器的代码 this gt addElement datePicker movie release date array label
  • 日语的 Unicode 范围

    我正在尝试区分英语和日语字符 我需要找到所有日语字符的 Unicode 范围 所有日语字符的 Unicode 范围是多少 正如扎维图提到的 这一页有几个 unicode 范围的参考 总结一下范围 日式标点符号 3000 303f 平假名 3
  • 在脚本中使用 Bugzilla Perl API 时如何进行身份验证?

    工作从Bugzilla API 我编写了一个快速 Perl 脚本来克隆 Bugzilla 产品 在新产品下重新创建所有组件 Bugzilla Perl API 非常容易从命令行使用 我本来可以直接处理数据库 但我想要一个长期的解决方案 另一
  • 如何在指定计数后中断 xsl 中的表行?

    我有以下 xsl 按字母顺序对 xml 进行排序
  • 组合设计模式:如何将结果从一个组件传递到另一个组件?

    我有以下代码 interface IService void Execute class ServiceA IService public void Execute class ServiceB IService public void E
  • Python:匹配之间的连续行类似于 awk

    Given 多行字符串string 已经从文件中读取file 两种图案pattern1 and pattern2它将匹配恰好一行中的子字符串string每个 这些线将称为 line1 和 line2 这些模式是正则表达式模式 但如果这样更容
  • 将带有 NodaTime 自动道具的模型发布到 WebAPI

    我们正在项目中使用 NodaTime 作为时间 日期模型 该项目是一个Web应用程序 使用WebAPI 当尝试发布包含 LocalTime autoprops 的模型时 我们收到 InsufficientExecutionStackExce