C# 如何在此场景中验证web api请求对象?
我在WebAPI2.2项目中有一个api/v1/users/SearchURI。此uri接受UserSearchRequest对象。以下是一个示例:C# 如何在此场景中验证web api请求对象?,c#,asp.net,.net,asp.net-web-api,asp.net-web-api2,C#,Asp.net,.net,Asp.net Web Api,Asp.net Web Api2,我在WebAPI2.2项目中有一个api/v1/users/SearchURI。此uri接受UserSearchRequest对象。以下是一个示例: { "DomainName":"ad.corp.domain", "NetworkUserId":"jsmith2", "FirstName":"John", "LastName":"Smith" } 后端搜索逻辑将附加所有提供的请求参数值,以过滤返回的用户集。否则,空请求对象将导致返回所有用户。但是,如果客户端传递了如下请求,则将返回所有用户:
{
"DomainName":"ad.corp.domain",
"NetworkUserId":"jsmith2",
"FirstName":"John",
"LastName":"Smith"
}
后端搜索逻辑将附加所有提供的请求参数值,以过滤返回的用户集。否则,空请求对象将导致返回所有用户。但是,如果客户端传递了如下请求,则将返回所有用户:
{
"UserName":"jsmith2"
}
在上面的示例中,错误地使用了无效的属性UserName而不是NetworkUserId。但是,Web API并没有返回错误,它只是忽略了附加属性并返回了所有用户,因为没有提供有效的搜索条件属性值
验证传入请求的正确方法是什么?如果提供了无效的prpoerty名称,那么Web API将返回404 BADDREQUEST,最好指示无效的属性名称?如果属性名称或数据类型不正确,web api将无法将json反序列化为UserSearchRequest对象,api控制器参数将为null。您可以检查null,这将表明输入请求的格式不正确。以下是示例代码:
public async Task<IActionResult> SearchUsers([FromBody] UserSearchRequest
searchRequest) {
if(searchRequest == null)
{
return BadRequest();
}
//For valid search request, continue search...
}
public异步任务SearchUsers([FromBody]UserSearchRequest)
搜索请求){
if(searchRequest==null)
{
返回请求();
}
//对于有效的搜索请求,请继续搜索。。。
}
您正面临“过度发布”问题。这可以通过两种不同的方式处理:
Bind
属性并将所需的属性列入白名单或黑名单
public ActionResult search([Bind(Exclude="UserName")] Person person)
{
...
}
public ActionResult search([Bind(Include="DomainName, NetworkUserId,
FirstName, LastName")] Person person)
{
...
}
IModelBinder
来创建自定义模型绑定器。这将标识额外的列并将其作为错误处理。您可以检查实现
我想这里是从特定的x或y表中获取数据。这里显示的是返回目录数据。这其实是很容易的一部分。您可以管理验证的控制器代码。我认为您正在尝试获取“NetworkUserId”,但您可能会被更改为用户名。请检查您的数据类型。请附上您的控制器代码和模型类。谢谢。您可以考虑要求字段,并使用诸如<代码> */COD>之类的东西来表示“ALL”。我看不到任何代码,但我可以推断问题不是发送了无效属性,而是反序列化为该属性创建了一个
null
的对象。我想你的意思是400
,而不是404
。不,有10个搜索属性,没有一个是必需的。你不能同时拥有它们。但是根据OP,这是一个有效的请求,应该返回所有数据。不,我已经有了验证检查。如果包含一个额外的无效属性,那么web api将通过以下方式忽略该属性:default@Harsh否该请求应被视为无效,并应在BadRequest中返回一条消息,如“UserName不是有效的UserSearchRequest属性名”一个选项可能是将输入参数数据类型设置为动态,以接收输入对象,然后检查输入搜索对象是否有其他无效属性