我有一个包含多个控制器的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/Mobilestations
:
所以他使用默认路线。为什么我的自定义路由仅在此控制器上未检测到?它是唯一一个不访问数据库以获取信息的人。 DAL中没有表MobileStation,我也不想将空表放入我的数据库,只是为了让它工作。路由引擎关心数据库的是什么?
答案 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() { ... }
}