首页 > 解决方案 > 在 ASP.NET Core 中向端点发送带有空字符串的 POST 时如何防止 JSON 异常?

问题描述

今天我发现,当我发送带有(空字符串)的POST""时,它会引发异常。

public IActionResult SendRegistrationLink([FromBody] JObject json) {
  ...
}

例外:

InvalidCastException: Unable to cast object of type 'Newtonsoft.Json.Linq.JValue' to type 'Newtonsoft.Json.Linq.JObject'.

lambda_method(Closure , object , object[] )
Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(object target, object[] parameters)
Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor+SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

我知道,这是因为使用JObject. 我应该使用非常具体的模型还是只使用Object然后反序列化它?或者你有更好的解决方案吗?我愿意接受任何建议。

当然还有我的 CURL:

curl -X POST -H 'Content-Type: application/json' -i http://localhost:5001/api/something --data '""'

标签: c#asp.netjsonasp.net-core

解决方案


使用 ASP.NET Core 时,始终使用强类型。永远不要使用JObject这种情况下的类型。为您的需求创建模型。就像是:

public class yourType
{
   private int x; 
   private string xyz; // you know what I mean.
}

希望这可以帮助。


推荐阅读