[英]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.