gpt4 book ai didi

c# web api 请求验证过滤器,上下文值为空 - 参数列表不是

转载 作者:行者123 更新时间:2023-11-30 23:28:56 25 4
gpt4 key购买 nike

我正在使用 C# web api 并想为所有请求创建一个过滤器。

我为每个请求指定了一个类,所以我只想添加一些数据注释并完成验证。

问题是每次在 actionContext.ModelState.IsValid 上我都得到 true

我已经在配置中添加了我的过滤器:

config.Filters.Add(new RequestValidationFilter());

验证方法看起来和网络上的其他方法一样

public class RequestValidationFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid == false)
{
var errors = actionContext.ModelState
.Values
.SelectMany(m => m.Errors
.Select(e => e.ErrorMessage));

actionContext.Response = actionContext.Request.CreateErrorResponse(
HttpStatusCode.BadRequest, actionContext.ModelState);

actionContext.Response.ReasonPhrase = string.Join("\n", errors);
}
}
}

我有以下方法:

[HttpPost, Route("User/Login")]
public async Task<Responses.Login> Login(Requests.Login request)
{
...//some login logic
}

另外,我有我的模型:

public class Requests
{
public class Login
{
[Required(AllowEmptyStrings = false, ErrorMessage = "Email address cannot be empty!")]
[MinLength(5)]
public string Email;
[Required]
public string Password;
}
}

我正在发送一个空请求或 EmailPassword 为 null 的请求,但 actionContext.ModelState.IsValid 仍然对其进行评估作为 true

附件是发送电子邮件但未发送密码时的图像。

enter image description here

在评论之后,这是我通过 Advanced Rest Client chrome 插件提出的请求

enter image description here注意

图像实际上显示键和值是空的,而实际上它们是提供的..

编辑

我也尝试过的事情的数量:

  1. 删除所有其他过滤器,为什么?也许上下文被另一篇读物弄乱了。
  2. 根据字段发送有效请求,但电子邮件是 1 个字符长。为什么?也许 Required 的工作方式与其他人不同,仍然没有关于最小长度问题。
  3. 我为 Login 对象创建了一个单独的独立类,而不是嵌套对象。为什么?认为它嵌套验证的事实可能不是递归的。
  4. 逐一循环Arguments 列表并验证为对象,答案始终为真。永远不会失败,为什么?因为我几乎认输了。
  5. 没有像我在问题中描述的那样向配置添加过滤器,而是尝试了 GlobalConfiguration.Configuration.Filters.Add(new RequestValidationFilter());

最佳答案

你需要添加{ get;放; 在你的模型属性之后:

public class Login
{
[Required(AllowEmptyStrings = false, ErrorMessage = "Email address cannot be empty!")]
[MinLength(5)]
public string Email { get; set; }

[Required]
public string Password { get; set; }
}

这是必要的,因为 ASP.NET 的默认模型验证仅包括具有公共(public) get 方法的属性。来自 PropertyHelper.cs , 下面是一些代码,用于确定模型上的属性是否将包含在验证中:

// Indexed properties are not useful (or valid) for grabbing properties off an object.
private static bool IsInterestingProperty(PropertyInfo property)
{
return property.GetIndexParameters().Length == 0 &&
property.GetMethod != null &&
property.GetMethod.IsPublic &&
!property.GetMethod.IsStatic;
}

此方法用于过滤 MVC/Web API 中默认模型绑定(bind)中使用的属性。请注意,它正在检查属性上是否存在 GetMethod 以及它是否是公共(public)的。由于您的类在其属性上没有 get 方法,因此它们被忽略了。

如果你想了解更多,你可以通过浏览 ASP.NET MVC source 来消磨很多时间。 .我认为 github 上的代码适用于较新版本的 ASP.NET,但似乎很多相同的逻辑都适用于您正在使用的版本。

关于c# web api 请求验证过滤器,上下文值为空 - 参数列表不是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35752597/

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