如何在 WEB Api 2 中有一个指向两个接受不同参数的不同控制器端点的路由

How to have a Route which points to two different controller end points which accepts different arguments in WEB Api 2

如何在 WEB 中创建一个指向两个接受不同参数的不同控制器端点的路由 Api 2 我在控制器中声明了两个不同的端点,至于 REST 透视图,我必须对两个端点都使用 alpha/{aplhaid}/beta 格式,

            [Authorize]
            [HttpPost]
            [Route("alpha/{aplhaid}/beta")]
            public async Task<HttpResponseMessage> CreateAlpha(Beta beta, string projectId, [FromHeader] RevisionHeaderModel revision)

            [Authorize]
            [HttpPost]
            [Route("alpha/{aplhaid}/beta")]
            public async Task<HttpResponseMessage> CreateAlpha(List<Beta> betas, string projectId, [FromHeader] RevisionHeaderModel revision)

是否可以使用具有不同参数的同一路由器指向 Web 中的 2 个不同端点API2?

使用一个路由并从第一个控制器调用内部的另一个控制器。

重载 web api 基于参数类型的操作方法未得到很好的支持。 但是 attribute based routing 呢?

你可以找出一个很好的例子here

路由约束让您可以限制路由模板中参数的匹配方式。一般语法是 "{parameter:constraint}"。例如:

[Route("users/{id:int}"]
public User GetUserById(int id) { ... }

[Route("users/{name}"]
public User GetUserByName(string name) { ... }

而且我认为这个 link 一定是 helpful

如果您确实需要 相同的路线和相同的 ActionName,您可以使用 IHttpActionSelector

public class CustomActionSelector : ApiControllerActionSelector, IHttpActionSelector
{
    public new HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
    {
        var context = HttpContext.Current;

        // Read the content. Probably a better way of doing it?
        var stream = new StreamReader(context.Request.InputStream);
        var input = stream.ReadToEnd();

        var array = new JavaScriptSerializer().Deserialize<List<string>>(input);
        if (array != null)
        {
            // It's an array
            //TODO: Choose action.
        }
        else
        {
            // It's not an array
            //TODO: Choose action.
        }

        // Default.
        var action = base.SelectAction(controllerContext);
        return action;
    }

    public override ILookup<string, HttpActionDescriptor> GetActionMapping(HttpControllerDescriptor controllerDescriptor)
    {
        var lookup = base.GetActionMapping(controllerDescriptor);
        return lookup;
    }
}

在您的 WebApiConfig 中:

    config.Services.Replace(
        typeof(IHttpActionSelector),
        new CustomActionSelector());

您的控制器示例:

public class FooController: ApiController
{
    [HttpPost]
    public string Post(string id)
    {
        return "String";
    }

    [HttpPost]
    public string Post(List<string> id)
    {
        return "some list";
    }
}

如果您问我,该解决方案有一些很大的缺点。首先,您应该寻找仅在需要时才使用此 CustomActionSelector 的解决方案。不适用于所有控制器,因为它会为每个请求产生开销。

我认为你应该重新考虑为什么你真的需要两条必须完全相同的路线。我认为如果同一条路线接受不同的论点,可读性将会受到影响。但这只是我的意见。

我会改用不同的路线。