为什么无法导航到web api控制器

时间:2014-08-25 10:46:16

标签: asp.net-mvc asp.net-web-api asp.net-web-api2 asp.net-web-api-routing

我第一次使用Web API将我的移动应用程序连接到Web API 我有MVC 5项目,我创建了API文件夹,在里面创建了ProductsController

namespace DDD.WebUI.API
{
    public class ProductsController : ApiController
    {
        public string GetAllProducts()
        {
            return "Hello From WebAPI";
        }

    }
}

我尝试从浏览器访问此方法:

http://localhost:21879/DDD.WebUI/API/products/GetAllProducts

但我得到404.
它可能是一些愚蠢但却无法理解的东西:(
更新

public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapRoute(
               name: "DefaultApi",
               url: "API/{controller}/{action}/{id}",
               defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
           );

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );



        }

更新2
我有一点进步: 我已将Application_Start()更新为:

GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);

WebApiConfig我有:

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

我仍然在Project / Api / ProductsController中存储API控制器 但现在我可以访问它但仍无法从中获取价值:

http://localhost:21879/api/products/getallproducts

但我得到的错误是:

<Error>
<Message>The request is invalid.</Message>
<MessageDetail>
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.String Get(Int32)' in 'GSL.WebUI.Api.ProductsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
</MessageDetail>
</Error>

3 个答案:

答案 0 :(得分:7)

我遇到了同样的问题。观察您在Global.asax.cs中注册路由的顺序。

这有效:

GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);

这不是:

RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);

答案 1 :(得分:4)

如果使用这种路由方式,则需要为操作指定允许的Http方法:

public class ProductsController : ApiController
{
    [HttpGet]
    public string GetAllProducts()
    {
        return "Hello From WebAPI";
    }
}

您可以通过此链接获取有关API路由的所有信息:http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

答案 2 :(得分:1)

我认为查看您的更新时,您的操作需要id这是一个不可为空的int,而您只是修改网址而不是http://localhost:21879/API/products/GetAllProducts/2 '2'分配给'id',它将起作用。

在WebApiConfig中修改路由为:

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

只需更改此Mvc路线:

    routes. MapRoute(
           name: "DefaultApi" ,
           url: "API/{controller}/{action}/{id}" ,
           defaults: new { controller = "Home" , action = "Index" , id = UrlParameter .Option
       );

用这个:

     routes. MapRoute(
           name: "DefaultApiMvc" ,
           url: "APIMvc/{controller}/{action}/{id}" ,
           defaults: new { controller = "Home" , action = "Index" , id = UrlParameter .Option
       );

因为否则Mvc和Api路线会相互冲突......