【问题标题】:Abstract controller method fail to be recognized while concrete one does [duplicate]抽象控制器方法无法识别,而具体控制器方法则无法识别[重复]
【发布时间】:2017-04-11 12:01:36
【问题描述】:

所以我在我们的 Web API 项目中几乎没有进行重构,我注意到在抽象类中提取一个具有所有需要属性的控制器会很好,所以我所做的是:

  • 从我现有的控制器中提取抽象类和方法:

    [RoutePrefix("api/auth")]
    public class AdminController : BaseAdminController
    

所以BaseAdminController 看起来像这样:

public abstract class BaseAdminController : BaseApiController
{
    [HttpGet]
    [Route("validatetoken")]
    public abstract IHttpActionResult ValidateToken(string token);
}

这是我使用的路由:

public static void Register(HttpConfiguration config)
{
    // Web API configuration and services
    // Web API routes
    config.MapHttpAttributeRoutes();
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/"
    );
}

现在我注意到,当使用抽象控制器测试代码时,它会抛出:

找不到与名为“auth”的控制器匹配的类型

虽然相同的实现但没有抽象类和方法也可以正常工作。

我正在使用这个网址进行测试:

http://localhost:60747/api/auth/validatetoken?auth_token=117a2686-dad3-4b1e-a5eb-94aebed45d06

【问题讨论】:

    标签: c# .net asp.net-web-api controller asp.net-web-api-routing


    【解决方案1】:

    Inherited attribute 控制子类是否从超类继承任何特定属性。默认值是true。

    不幸的是,对于您的重构,RouteAttributeRoutePrefixAttribute 属性都是具有 Inherited = false 的密封类。您需要在所有具体的控制器类和方法上明确声明这些属性。

    【讨论】:

    • 我不明白 .. 我的 RoutePrefix 属性放在了我的具体类上,什么是我反编译了 Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll (这是我的项目用于此属性的程序集)和RouteAttribute 被标记为Inherited = true 我有点惊讶 msdn 显示相反的内容..
    • 这个答案是错误的。查看链接的副本。
    猜你喜欢
    • 2018-11-11
    • 2016-05-30
    • 1970-01-01
    • 2021-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多