我在试着理解Web是如何解决路由问题的。我有两条使用相同基本路径的路由
[WriteRoute(DivisionAPIRoutes.PAYROLL_IMPORT_PTO)]
[HttpPost]
public void ImportPTOByIds(GlobalEntityKey<IDivision> parentId, GlobalEntityKey<IDivisionPayCalendar> id,
ImportPTORequestDTO importPTORequest, [FromUri] GlobalEntityKey<IPTORequest>[] ptoRequestIds)
{
GlobalFactory<IEmployeePTOListService>.Instance.ImportPTOByIds(parentId, id, ptoRequestIds, importPTORequest);
}
[WriteRoute(DivisionAPIRoutes.PAYROLL_IMPORT_PTO)]
[HttpPost]
public void ImportPTOByFilter(GlobalEntityKey<IDivision> parentId, GlobalEntityKey<IDivisionPayCalendar> id, ImportPTORequestDTO importPTORequest, string filterOptions,
[FromUri] GlobalEntityKey<IPTORequest>[] excludedPTORequestIds)
{
var filterOptionsDTO = JsonConvert.DeserializeObject<FilterOptionsDTO>(filterOptions);
GlobalFactory<IEmployeePTOListService>.Instance.ImportPTOByFilter(parentId, id, filterOptionsDTO, excludedPTORequestIds, importPTORequest);
}注意:默认情况下,构建CLR类型字符串,int从URI中检索。
我提出了一个很好的post请求,但我试图理解路由如何解析到该方法的基本逻辑:
(为方便起见而解码)
“查询”:“"filterParameters":{"fieldName":"RequestStartDate",”parsebleValue:“2016-01-01”,"filterType":"GreaterThanOrEqual"},{"fieldName":"RequestStartDate","parsebleValue":"2017-12-31","filterType":"LessThanOrEqual"}} PostBody:{ AlwaysCreateNewCheck: false,PayBatchType:'Checks',PayBatchId:'1903771‘}
如果我忽略了请求中的,则为excludedPTORequestIds。这仍然将解析为ImportPTOByFilter filterOptions ,但是如果我包含了excludedPTORequestIds,而忽略了,则会选择 ImportPTOByIds 。
我倾向于认为,由模型绑定器处理的List和Array与其他默认CLR类型(string、int、Guid等)有不同的行为。
虽然字符串是必需的,并将抛出404或解析到其他路由,数组的不需要在请求中显式定义。
假设WebApi的路由解析的其他规则是什么是安全的。
发布于 2017-12-20 20:05:46
当您包含ImportPTOByFilter时,它将解析为filterOptions,因为另一条路由没有筛选器选项参数。
如果删除filter选项,它将解析为ImportPTOByIds,因为参数与方法签名匹配。路由解析将根据路由名称和参数进行。如果你有
RouteA(string myString, int myInt) {...}和
RouteA(string myString) {...}和
RouteA(int myInt) {...}如果您传递一个字符串、int或两者,它将根据这个路由进行解析。
比我更有见识的其他人可能会添加更多的信息,但我认为您想要建立一个实际的模型--以这种方式封装整个请求--您有一个方法,在那个方法中,您检查模型以确定是否应该过滤它。
https://stackoverflow.com/questions/47913086
复制相似问题