![](/img/trans.png)
[英]ASP.NET Web API Attribute Routing: RoutePrefix with Route Parameter
[英]ASP.NET Web API Route not found with Attribute Routing
我有一個包含多個控制器的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;
}
}
我在所有Controller中使用屬性路由,用法完全相同。 這是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;
}
我將路由調試器用於此結果。 網址是api/Mobilestations
:
因此,他使用默認路由。 為什么僅在此控制器上未檢測到我的自定義路由? 這是唯一不訪問數據庫獲取信息的數據庫。 DAL中沒有表MobileStation,我不想將一個空表放入數據庫中,只是為了使其正常工作。 路由引擎關心數據庫什么?
動作不能是靜態方法
控制器上的哪些方法被視為“動作”? 選擇動作時,框架僅查看控制器上的公共實例方法 。 而且,它不包括“特殊名稱”方法(構造函數,事件,運算符重載等)以及從ApiController類繼承的方法。
來源: 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")] //GET api/MobileStations
public async Task<IEnumerable<MobileStation>> GetMobileStationsAsync() { ... }
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.