我在下面定义了一个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。 这给我带来了一个问题,因为我使用 null 对象调用 _mediator.Send
方法并引发异常。
可以理解的是,简单的解决方案是在操作中检查 null 并在需要时实例化一个对象,但我不愿意这样做,并且希望有一个更优雅的解决方案。
有没有办法确保我永远不会收到空项目作为操作参数?
也许通过以某种方式拦截参数绑定步骤...?
我刚刚遇到了完全相同的问题,Mediatr
对空参数不满意,但 Web API 不允许我将其定义为可为空。
这是我能想到的最优雅的解决方案,而不会弄乱模型绑定逻辑。
/// <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