Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在此场景中验证web api请求对象?_C#_Asp.net_.net_Asp.net Web Api_Asp.net Web Api2 - Fatal编程技术网

C# 如何在此场景中验证web api请求对象?

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" } 后端搜索逻辑将附加所有提供的请求参数值,以过滤返回的用户集。否则,空请求对象将导致返回所有用户。但是,如果客户端传递了如下请求,则将返回所有用户:

我在WebAPI2.2项目中有一个api/v1/users/SearchURI。此uri接受UserSearchRequest对象。以下是一个示例:

{
"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属性名”一个选项可能是将输入参数数据类型设置为动态,以接收输入对象,然后检查输入搜索对象是否有其他无效属性