复杂类型参数的 URL 匹配不明确



我的控制器类中有 2 个 http GET API,它们具有相同的路由但不同的复杂类型参数,如下所示:

[httpGet]
[Route("info")]
public async Task<IActionResult> GetinfoA(A classAobj){...}
[httpGet]
[Route("info")]
public async Task<IActionResult> GetinfoB(B classBobj){...}
------------------
class A{
string prop1{get;set;}
string prop2{get;set;}
}
class B{
string prop3{get;set;}
string prop4{get;set;}
}

我正在寻找的是根据类属性的名称匹配操作 例如,如果查询具有参数 prop3 操作,则应匹配 getinfoB 并且 如果它有参数 prop1 应该匹配 GetinfoA。 目前我的请求出现模棱两可的错误,例如/info?prop1="bla">

我的第一个选择是以不同的方式命名路由,但是如果您确实需要两个不同参数的单个方法,我会将这两个操作合并为一个接收包装器对象作为参数的操作。有点:

[Route("info")]
public async Task<IActionResult> Getinfo(Wrapper obj){
if (obj.ObjA != null) doA(obj.ObjA);
else if (obj.ObjB != null) doB(obj.ObjB);
}
------------------
class Wrapper {
A ObjA { get; set; }
B ObjB { get; set; }
}
class A{
string prop1{get;set;}
string prop2{get;set;}
}
class B{
string prop3{get;set;}
string prop4{get;set;}
}

或者只是接收并object参数并尝试转换它。

但如前所述,我会重命名路线。

我找到了类似于 MVC 模棱两可的操作方法 ASP.NET 解决方案

定义了一个类,如下所示:

public class RequireRouteValuesAttribute : Microsoft.AspNetCore.Mvc.ActionConstraints.ActionMethodSelectorAttribute
{
public RequireRouteValuesAttribute(string[] valueNames)
{
ValueNames = valueNames.Select(s => s.ToLowerInvariant()).ToArray();
}
public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
{
return ValueNames.Any(v => routeContext.HttpContext.Request.Query.Keys.Contains(v));
}
public string[] ValueNames { get; private set; }
}

然后用这个类装饰我的动作:

[Route("info")]
[RequireRouteValuesAttribute(new[]{"prop1","prop2"})
public async Task<IActionResult> GetinfoA(A classAobj){...}
[Route("info")]
[RequireRouteValuesAttribute(new[]{"prop3","prop4"})
public async Task<IActionResult> GetinfoB(A classBobj){...}

最新更新