C# ASP.NET Web API更改请求URI(重定向到其他方法)

C# ASP.NET Web API更改请求URI(重定向到其他方法),c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我有一个ASP.NET项目,其中通过URL版本控制实现了API版本控制。例如: api/v1/Resource api/v2/Resource 现在的要求是,如果用户请求的资源在该版本中不可用,那么它应该回退到以前的版本。假设用户想要访问api/v2/SomeResource,但不可用,那么请求应该转发到api/v1/SomeResource 我们可以拦截每个传入请求并在决定路由之前更改RequestURI吗 我尝试使用DelegatingHandler更改请求URI,但似乎在执行Delega

我有一个ASP.NET项目,其中通过URL版本控制实现了API版本控制。例如:

api/v1/Resource
api/v2/Resource
现在的要求是,如果用户请求的资源在该版本中不可用,那么它应该回退到以前的版本。假设用户想要访问
api/v2/SomeResource
,但不可用,那么请求应该转发到
api/v1/SomeResource

我们可以拦截每个传入请求并在决定路由之前更改RequestURI吗

我尝试使用DelegatingHandler更改请求URI,但似乎在执行DelegatingHandler之前就决定了路由

protected override Task<HttpResponseMessage> SendAsync
    (HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
{
    request.RequestUri = new Uri(getNewURI(request.RequestUri.AbsoluteUri), UriKind.Absolute);
    return base.SendAsync(request, cancellationToken);
}
受保护的覆盖任务SendAsync
(HttpRequestMessage请求,System.Threading.CancellationToken CancellationToken)
{
request.RequestUri=newuri(getNewURI(request.RequestUri.AbsoluteUri),UriKind.Absolute);
返回base.sendaync(请求、取消令牌);
}

在通过Web API或任何其他方式完成路由之前,我们是否可以更改RequestUri以完成此类重定向?

如果您已经提前知道路由不再存在(如果您知道要重定向到哪个路由,则必须这样做),那么您可以向同一方法添加多个路由。否则,您必须调用该路由以查看它是否存在,如果它给出了404,那么您必须再次尝试下一个,以此类推

[HttpGet, Route("api/v2/resource")]
[HttpGet, Route("api/v1/resource")]
public IHttpActionResult YourMethod()
{

}

是的,添加多个路由是可行的,但是随着时间的推移,随着新的API版本出现,“v3,v4……”,
RouteAttribute
将url模板作为参数,因此您可以使用
[Route(“API/{version}/resource”)]
。但这会在同一URL上找到多个控制器方法,并且只有在其他地方存在时才会抛出错误。您需要知道哪些资源已被移动。若要知道在另一个版本中找不到端点时需要调用另一个端点,则意味着您知道缺少了哪个端点以及需要路由到哪个端点。@StephenBrickner我以前的回答是@R Day,因为使用“api/{version}/resource”会与“api/v2/resource”或“api/v3/resource”冲突如果将来出现这种情况