gpt4 book ai didi

c# - 处理将操作参数绑定(bind)到不正确类型的路由值的错误

转载 作者:行者123 更新时间:2023-11-30 12:46:09 25 4
gpt4 key购买 nike

我在处理 ASP.NET WebAPI 中的所有 类型的错误时遇到问题。

我已经使用 ExceptionFilter 成功地处理了在我的操作方法中抛出的异常和 invalid routes, invalid controller or action name 的 404 错误.但是,我正在努力处理同时找到 Controller 和操作的错误,但模型绑定(bind)的参数类型不正确。

这是我的操作,它被路由到 /api/users/{id}

[HttpGet]
public virtual TPoco Get(long id)
{
...
}

如果我请求 URL /api/users/notinteger,我会收到一个在我的代码之外处理的 400 Bad Request 错误:

{
Message: "The request is invalid.",
MessageDetail: "The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int64' for method '___ Get(Int64)' in '___'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}

我怎样才能拦截这个错误并用我自己的错误信息来回应?最好不要在 Controller 本身中,因为我想以相同的方式处理多个 Controller 。

我已经根据 this question 尝试使用 global.asax.csApplication_Error 事件,但在这种情况下似乎没有被调用。

最佳答案

这些错误似乎是作为模型绑定(bind)错误添加到 ModelState 中的。 Action 选择器选择正确的 Action , Action 调用者调用它而不抛出任何错误。

我想到的解决方法是创建一个 Action 调用程序来检查 ModelState 是否有错误。如果找到任何一个,它会将第一个传递给我的 ExceptionFilterErrorController 使用的异常处理方法。

internal class ThrowModelStateErrorsActionInvoker : ApiControllerActionInvoker
{
public override Task<HttpResponseMessage> InvokeActionAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
foreach (var error in actionContext.ModelState.SelectMany(kvp => kvp.Value.Errors))
{
var exception = error.Exception ?? new ArgumentException(error.ErrorMessage);
//invoke global exception handling
}

return base.InvokeActionAsync(actionContext, cancellationToken);
}
}

这很讨厌,但它确实有效。这占据了我一天的大部分时间,我很高兴终于有所收获。

我很想知道这样做的后果是什么。还有什么使用 Web API 中的 ModelState 错误?谁能在此解决方案中添加一些可能的缺陷?

关于c# - 处理将操作参数绑定(bind)到不正确类型的路由值的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21239934/

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