在ASP.NET WebApi 2中有以下控制器:
[RoutePrefix("Validations")]
public partial class ValidationsController
{
[HttpPost, Route("Bsb")]
public IHttpActionResult ValidateBsb(string value)
{
var validator = new BankStateBranchValidator(DbContext.BankStateBranches);
var data = new ValidationsResult
{
IsValid = validator.IsValid(value ?? string.Empty)
};
data.Error = data.IsValid
? null
: "The BSB you have entered does not appear to be valid. Please check the value and try again.";
return Ok(data);
}
}
由于历史原因,value
参数需要位于querystring中,而不是应该为空的表单主体中。因此,预期的API调用将是POST /Validate/Bsb?value=012345
。
这一切都很好,而且我得到了预期的结果;但是,有时我们让客户端用POST /Validate/Bsb
或POST /Validate/Bsb?value=
调用API,这将导致来自WebAPI本身的400 Bad Request
响应,因为据我所知,模型绑定器未能将缺失的值绑定到参数。如果我在方法中放置一个断点,它就永远不会被击中。
因此,考虑到我无法更改API契约,我如何处理这个场景?我尝试将一个[ValueProvider(typeof(RouteDataValueProviderFactory))]
属性添加到参数中,而我对缺失值的测试用例可以工作,但是有效值测试用例会中断,因为值不在路由中,而是在查询字符串中。
更新
根据Craig的建议,我向value
参数添加了一个默认值。因此,各种情况是:
POST /Validate/Bsb?value=012345
-通行证(有效值)POST /Validate/Bsb?value=000000
-传递(无效值)POST /Validate/Bsb?value=
-失败(空值)POST /Validate/Bsb
- pass (缺失值)发布于 2020-09-25 15:47:47
通过在方法签名中指定默认值,您应该能够使参数成为可选的。
例如:
[HttpPost, Route("Bsb")]
public IHttpActionResult ValidateBsb(string value = null)
您的问题是,使用?value=
的查询抛出了一个错误的请求。
当我在本地尝试时,我的断点被击中,value
是null
。
如果我完全忽略了QS参数,那么我收到了一个不允许响应的方法。
此页提到了带有属性路由的可选路由参数,尽管您没有在这里指定这样的参数。
我找不到描述有关路由和可选参数的其他选项的文档。我看到了一种方法,它表明在路由定义中将其定义为可选与在方法签名中将其定义为可选之间的区别。如果我找到了,我会更新这个答案!
https://stackoverflow.com/questions/63984446
复制相似问题