可选参数

时间:2018-02-15 13:58:41

标签: c# asp.net .net asp.net-web-api

我继承的这个项目有点像拙劣的工作;这是一个带有api层的Windows服务......我不认为这是问题

示例控制器

[Route("Test/GetUsers")]
[HttpGet]
public string GetUsers(bool? enabled=null, bool? sync=null)
{
   // do whatever
}

所以调用https://myapi/Test/GetUsers?enabled=true&sync=true可以正常工作

但是,如果我调用https://myapi/Test/GetUsers?enabled=true我从服务器返回400 Bad Request:“Arguments not not null”

稍微摆弄一下后,我找到了

[Route("Test/GetUsers")]
[HttpGet]
public string GetUsers(bool enabled=false, bool sync=false)
{
   // do whatever
}

意味着https://myapi/Test/GetUsers?enabled=true可以正常工作。

我实际上想要null bool,因为逻辑就像这样

if (enabled != null)
{
    // add Enabled = True/False clause to the query
}

因此,如果enabled为空,则会同时启用启用和禁用用户

1 个答案:

答案 0 :(得分:0)

我不确定这对任何人有多大用处,但我会把它留作asnwer

该类中有一个私有只读HttpSelfHostConfiguration字段用作服务的ServiceBase

在该类的构造函数中,它实例化并向ActionFilterAttribute集合添加了自定义HttpSelfHostConfiguration.Filter

public class ValidateViewModelAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ActionArguments.Any(kv => kv.Value == null))
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Arguments cannot be null");
        }

        if (actionContext.ModelState.IsValid == false)
        {
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.BadRequest, actionContext.ModelState);
        }
    }
}

删除第一个if语句显然解决了我的问题,因为这会停止任何具有null参数的操作。我意识到,为了我的尴尬,在项目中寻找"参数不能为零"可能会让我直接导致罪魁祸首