gpt4 book ai didi

c# - 在没有路由或查询字符串参数的 Asp.Net WebApi 操作中使用 FromUri 属性时,是否可以强制实例化复杂类?

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:57 27 4
gpt4 key购买 nike

我在下面定义了一个 WebApi 操作。
(我使用的是 MediatR 库,它与我的问题略有相关)

[HttpGet]
[Route]
public async Task<IHttpActionResult> Search([FromUri] SearchTransactionsRequest request)
{
var response = await _mediator.Send(request);
return Ok(response);
}

以下 URL 已成功路由到我的操作:

/api/v1/transactions

但是,由于我没有定义任何路由参数并且我并不总是添加查询字符串参数,因此类 SearchTransactionRequest 有时会为 null。这给我带来了问题,因为我用空对象调用了 _mediator.Send 方法,它抛出了异常。

可以理解,简单的解决方案是在操作中检查 null 并在需要时实例化一个对象,但我不愿意这样做,并且希望有一个更优雅的解决方案。

有没有办法确保我永远不会收到空项目作为操作参数?

也许通过某种方式拦截参数绑定(bind)步骤...?

最佳答案

我刚刚遇到了这个完全相同的问题,Mediatr 对空参数不满意,但 Web Api 不允许我将其定义为可为空。

这是我在不扰乱模型绑定(bind)逻辑的情况下所能想到的最优雅的解决方案。

/// <summary>
/// Returns all objects
/// </summary>
/// <param name="request"></param>
/// <returns></returns>
[Route("")]
[ResponseType(typeof(IEnumerable<ObjectResponse>))]
public async Task<IHttpActionResult> GetObjects([FromUri] ObjectsGetRequest request) =>
Ok(await this.mediator.Send(request ?? new ObjectsGetRequest()));

这只需要为 [FromUri] 注释参数完成,所以它对我来说似乎没有那么大的干扰。

这实际上与将每个查询字符串参数作为值类型列为方法参数一样。

如果您需要请求者定义请求参数的值之一,请将其作为单独的 [FromUri] 参数提取并分配给您的请求,然后再将其发送给 Mediatr

关于c# - 在没有路由或查询字符串参数的 Asp.Net WebApi 操作中使用 FromUri 属性时,是否可以强制实例化复杂类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42035729/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com