我继承的这个项目有点像拙劣的工作;这是一个带有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
为空,则会同时启用启用和禁用用户
答案 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参数的操作。我意识到,为了我的尴尬,在项目中寻找"参数不能为零"可能会让我直接导致罪魁祸首