繁体   English   中英

ASP.NET Web Api网址设计

[英]ASP.NET Web Api url design

我尝试在ASP.NET MVC4应用程序中使用Web Api。

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {


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

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

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

    public class OrganisationApiController : ApiController
    {
        public List<Direction> GetDirections()
        {
            List<Direction> res = new List<Direction>();
            using (SerializerContext context = new SerializerContext())
            {
                res = context.DirectionSet.ToList();
            }
            return res;
        }

        public List<Departement> GetDepartements(int directionId)
        {
            List<Departement> res = new List<Departement>();
            using (SerializerContext context = new SerializerContext())
            {
                res = context.DepartementSet.Where(d => d.IdDirection == directionId).ToList();
            }
            return res;
        }
    }

应用开始于

protected void Application_Start()
        {           
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);
        }

开发时,我可以从OrganisationApiController调用所有方法: http://localhost:5000/api/OrganisationApi => GetDirections被称为http://localhost:5000/api/OrganisationApi/GetDirections => GetDirections被称为http://localhost:5000/api/OrganisationApi/GetDepartements/1 =>使用directionId = 1调用GetDepartement

但是,当我部署与IIS的服务器上http://myserver.com:5000/api/OrganisationApi => GetDirections被称为http://myserver.com:5000/api/OrganisationApi/GetDirections => GetDirections被称为http://myserver.com:5000/api/OrganisationApi/GetDepartements/1 => 404错误

我缺少什么?

您对这些路线有疑问:

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

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

第二条路由是不必要的(因为第一个路由已经处理了这些请求-id被指定为可选),并且您指定id是可选的但该路由根本不包含id时会出错。

删除第二条路线并更改您的操作,使其收到可选参数,或将其替换为:

config.Routes.MapHttpRoute(
                    name: "ActionIdApi",
                    routeTemplate: "api/{controller}/{action}/{id}",
                );

                config.Routes.MapHttpRoute(
                  name: "ActionApi",
                  routeTemplate: "api/{controller}/{action}",
                );

顺便说一句,您的默认记号也很成问题,因为您没有指定默认的控制器和操作-应该默认默认值 ...

从我这里看到的所有您的路线都可以用这条路线代替

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

只需替换控制器和操作的默认值即可。

编辑:

问题出在你的行动上:

如果您在Route“ id”参数中指定,则您的操作应为:

public List<Departement> GetDepartements(int id)

参数名称必须匹配。

您也可以将两个动作合并为一个动作:

public List<Departement> GetDepartements(int? id)
        {
            List<Departement> res = new List<Departement>();
            using (SerializerContext context = new SerializerContext())
            {
                if(id.HasValue)
                {
                    res = context.DepartementSet.Where(d => d.IdDirection == directionId).ToList();
                }
                else
                {
                    res = context.DirectionSet.ToList();
                }
            }
            return res;
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM