尝试在我的WebAPI上调用特定的GET方法,但是找不到HTTP 404

时间:2013-12-31 18:24:00

标签: c# asp.net-mvc asp.net-web-api routes

我正在调用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的记录列表。你能说出为什么这不起作用吗?

1 个答案:

答案 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)
{
    ...
}