使用“属性路由”找不到ASP.NET Web API路由

时间:2017-03-23 15:27:15

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

我有一个包含多个控制器的ASP.NET Web API项目。所有控制器都处理数据库中存在的模型,但只有一个。并且这个控制器没有解决他的(一)动作。这是控制器:

[RoutePrefix("api/MobileStations")]
public class MobileStationsController : ApiController
{
    /// <summary>
    /// Gets all clients
    /// </summary>
    /// <returns>All clients</returns>
    [HttpGet]
    [ActionName(nameof(GetMobileStationsAsync))]
    [Route("", Name = "GetMobileStations")]
    public static async Task<IEnumerable<MobileStation>> GetMobileStationsAsync()
    {
        var snmpConfig = CiscoWlcSnmpHelpers.ReadSnmpConfiguration();

        var clients = await CiscoWlcSnmpHelpers.GetAllClientsWithAllAccessPointsFromAllWirelessControllersAsync(snmpConfig);

        return clients;
    }
}

我在所有控制器中使用属性路由,具有完全相同的用法。以下是WebApiConfig.cs中的Register方法:

/// <summary>
/// Registers the config
/// </summary>
/// <param name="config"></param>
public static void Register(HttpConfiguration config)
{

    // Attribute routing
    config.MapHttpAttributeRoutes();

    // Conventional routing
    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional });

    config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
    config.Formatters.Remove(config.Formatters.XmlFormatter);
    config.Filters.Add(new ValidateModelAttribute());

    var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter;
    json.SerializerSettings.PreserveReferencesHandling = Newtonsoft.Json.PreserveReferencesHandling.Objects;
}

我使用了Route Debugger和这个结果。网址为api/MobilestationsRoute not found

路线选择表的摘录: Route not detected

所以他使用默认路线。为什么我的自定义路由仅在此控制器上未检测到?它是唯一一个不访问数据库以获取信息的人。 DAL中没有表MobileStation,我也不想将空表放入我的数据库,只是为了让它工作。路由引擎关心数据库的是什么?

1 个答案:

答案 0 :(得分:2)

不允许操作是静态方法

  

考虑控制器上的哪些方法&#34;操作&#34;?何时   选择一个动作,框架只查看 公共实例   控制器上的方法 。此外,它不包括&#34;特殊名称&#34;方法   (构造函数,事件,运算符重载等)和方法   继承自ApiController类。

来源:Routing and Action Selection in ASP.NET Web API: Action Selection

将操作更新为实例方法

[RoutePrefix("api/MobileStations")]
public class MobileStationsController : ApiController {

    /// <summary>
    /// Gets all clients
    /// </summary>
    /// <returns>All clients</returns>
    [HttpGet]
    [ActionName(nameof(GetMobileStationsAsync))]
    [Route("", Name = "GetMobileStations")] //GET api/MobileStations
    public async Task<IEnumerable<MobileStation>> GetMobileStationsAsync() { ... }
}