我正在调用http://localhost/AppTools.WebAPI/api/BulletinBoard/GetMessagesForApp/AppName
,但它返回404错误。我认为这与路由有关,但我不确定。
这是我的BulletinBoard控制器中的Web API方法:
[HttpGet]
public HttpResponseMessage GetMessagesForApp(string id)
{
// get current, valid messages
var messages = (from i in db.BulletinBoards
where i.AppId == id &&
DateTime.Today >= i.DisplayFrom &&
DateTime.Today <= i.DisplayTo &&
i.IsActive == true
select new
{
Message = i.Message,
IntervalId = i.IntervalId,
Interval = i.Interval.IntervalDescription,
Timeout = i.Timout,
})
.ToList();
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, messages);
return response;
}
这是我的RouteConfig.cs:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
标准Get()
和Get(int id)
工作正常,我没有更改方法名称或签名。 Get()
返回完整的记录列表,Get(int id)
返回特定记录。我希望GetMessagesByApp(string id)
返回特定于某个AppName的记录列表。你能说出为什么这不起作用吗?
答案 0 :(得分:6)
这是我的RouteConfig.cs:
RouteConfig.cs
文件用于定义ASP.NET MVC控制器的路由。这些与Web API控制器使用的路由完全无关。它们在WebApiConfig.cs
文件中定义。
因此,请确保您已将路线声明在适当的位置:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "ApiWithActionName",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
请注意,我在默认路由之前添加了一个自定义路由,这将允许您实现所需的URL模式。
然后你可以使用以下控制器动作,它可以正常工作:
// GET /api/controllername
// GET /api/controllername/get
[HttpGet]
public HttpResponseMessage Get()
{
...
}
// GET /api/controllername/get/123
[HttpGet]
public HttpResponseMessage Get(int id)
{
...
}
// GET /api/controllername/GetMessagesForApp/abc
[HttpGet]
public HttpResponseMessage GetMessagesForApp(string id)
{
...
}