c# - 在 WebApi 中如何在 Controller 类级别继承路由前缀?

标签 c# asp.net inheritance asp.net-web-api

请注意,我已经阅读了作为 WebApi 2.2 的一部分的新路由功能,以允许路由继承。但是,这似乎并没有解决我的特定问题。它似乎解决了继承 Action 级别路由属性的问题,但没有解决在类级别定义的路由前缀。 http://www.asp.net/web-api/overview/releases/whats-new-in-aspnet-web-api-22#ARI

我想做这样的事情:

[RoutePrefix("account")]
public abstract class AccountControllerBase : ControllerBase { }

[RoutePrefix("facebook")]
public class FacebookController : AccountControllerBase
{
    [Route("foo")]
    public async Task<string> GetAsync() { ... }
}

[RoutePrefix("google")]
public class GoogleController : AccountControllerBase
{
    [Route("bar")]
    public async Task<string> GetAsync() { ... }
}

我希望继承 account 路由前缀,因此在定义 Facebook 和 Google Controller 时,我得到路由:

~/account/facebook/foo
~/account/google/bar

目前,路由的定义没有来自基类的 account 部分。

最佳答案

我也有类似的需求。我所做的是:

public class CustomDirectRouteProvider : DefaultDirectRouteProvider
{
    protected override string GetRoutePrefix(HttpControllerDescriptor controllerDescriptor)
    {
        var routePrefix =  base.GetRoutePrefix(controllerDescriptor);
        var controllerBaseType = controllerDescriptor.ControllerType.BaseType;

        if (controllerBaseType == typeof(BaseController))
        {
            //TODO: Check for extra slashes
            routePrefix = "api/{tenantid}/" + routePrefix;
        }

        return routePrefix;
    }
}

其中 BaseController 是定义什么是前缀的那个。现在普通前缀可以工作了,您可以添加自己的前缀。配置路由时调用

config.MapHttpAttributeRoutes(new CustomDirectRouteProvider());

关于c# - 在 WebApi 中如何在 Controller 类级别继承路由前缀?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27463061/

相关文章:

c# - Log4net 发布时不写入

jquery - ASP.NET MVC 在页面加载时禁用下拉列表

java - 使用 Eclipse 生成组合代码

java - 如果我们在父类构造函数中添加一个super(),那么在创建子类的对象时,这个super()将调用哪个类?

java - JQL ORDER BY 子句和继承

c# - 在数据库中添加一个新列,该列应具有自动递增属性

c# - 覆盖 C# 的虚方法 - 为什么这不会导致无限递归?

c# - Oracle:算术运算导致溢出

asp.net - CSS 菜单水平对齐

c# - ASP.Net Web Api响应未经授权的访问