【问题标题】:OData Core Action ArgumetntNullExceptionOData 核心操作 ArgumetntNullException
【发布时间】:2020-11-27 22:00:10
【问题描述】:

我已经定义了一个可以为空的 Guid 参数的操作,如下所示:

   var searchLocationAction = builder.EntityType<SearchDummyDTO>().Collection.Action("GetLocation").Returns<SearchResultDTO>();
    searchLocationAction.Parameter<string>("searchPhrase");
    searchLocationAction.Parameter<Guid?>("areaId");

控制器方法看起来像

 [HttpPost]
  public async Task<IActionResult> GetLocation(ODataActionParameters parameters)

在 API 使用者使用错误正文发出请求的情况下:

{"searchPhrase":"","areaId":""}

将引发异常而不向用户提供任何反馈。同样在开发模式下,我们会得到一个参数空异常:

    <h1>An unhandled exception occurred while processing the request.</h1>
    <div class="titleerror">ArgumentNullException: Value cannot be null.<br />
Parameter name: source</div>
        <p class="location">System.Linq.Enumerable.ToList&lt;TSource&gt;(IEnumerable&lt;TSource&gt; source)</p>

我正在尝试找到一种解决方案,至少让消费者知道请求正文存在问题。

我尝试的是创建一个自定义中间件来捕获 ODataException,但这没有作为 odata 异常引发,这是无用的。

【问题讨论】:

    标签: asp.net-core odata


    【解决方案1】:

    在深入研究代码后,我意识到在控制器中:

    [HttpPost]
    public async Task<IActionResult> GetLocation(ODataActionParameters parameters)
    

    ODataActionParameters 为 null,这是因为 ModelState 错误,并且下一行的代码不期望 null 值。

    即使很困难,我们也有一个模型状态检查,这在某个时候被绕过并且没有正确处理。

    解决方法是从 ModelState 中获取错误并返回 BadRequest。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-12
      • 2021-03-20
      • 1970-01-01
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多