我正在尝试设置Web路由,因为我认为这是一件非常简单的事情。但是,Web API中的路由似乎与不同的HTTP谓词不一致。假设我有这个控制器有这些动作。
public class AvalancheController : ApiControllerBase
{
// GET api/avalanche
public IEnumerable<Avalanche> Get() {}
// GET api/avalanche/5
public Avalanche Get(int id) {}
// GET api/avalanche/ActionTest/5
[ActionName("ActionTest")]
public Avalanche GetActionTest(int id) {}
// GET api/avalanche/ActionTest/2
[ActionName("ActionTest2")]
public Avalanche GetActionTest2(int id) {}
// POST api/avalanche
public void Post([FromBody]Avalanche value) {}
// PUT api/avalanche/5
public void Put(int id, [FromBody]Avalanche value) {}
// PUT api/avalanche/test/5
[ActionName("Test")]
public void PutTest(int id, [FromBody]Avalanche value) {}
// DELETE api/avalanche/5
public void Delete(int id) {}
}我已经确定了以下路线..。
config.Routes.MapHttpRoute(
name: "ActionRoutes",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new
{
controller = "Avalanche",
action = "(ActionTest|ActionTest2|Test)"
}
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);然后我得到了以下的路线.
GET api/Avalanche/ActionTest/{id}
GET api/Avalanche/ActionTest2/{id}
PUT api/Avalanche/Test/{id}
GET api/Avalanche
POST api/Avalanche
DELETE api/Avalanche/{id}为什么默认的PUT路径不被选中?默认GET和默认PUT的路由有什么不同?我试着用每一种可以想象的方式来装饰函数,但是我得到了同样的结果。
我主要想知道如何获取默认的PUT路由。如果您对如何修改这些路由有任何建议,那么我就不需要为每个控制器指定操作名称提供一条路由,这也将是非常棒的。
谢谢!
伊恩
编辑:我今天早上注意到,下面的路线也没有被定义。
GET api/Avalanche/{id}发布于 2013-03-14 16:06:40
很高兴你找到了解决问题的办法。但是我会根据我的学习提供我的反馈和休息服务。resource的思想是将每个url解析为一个资源(或者实体),并根据HttpVerb决定操作。在这种情况下,您有三个GET操作,这与您的修改很好。
但我认为控制器也可以重新安排,使之具有单一的GET操作和单一的责任,从而更好地维护性。前任:
AvalancheController
public class AvalancheController : ApiControllerBase
{
public IEnumerable<Avalanche> GET()
{
}
public void POST(Avalanche avalanche)
{
}
}可以假设它处理顶级的所有雪崩,下面是要定义的操作。
GET :返回所有雪崩
邮寄:插入新雪崩
放置:未使用
删除:未使用
AvalancheDetailsController
public class AvalancheDetailsController : ApiControllerBase
{
public Avalanche GET(int id)
{
}
public int PUT(int id)
{
}
public int DELETE(int id)
{
}
}可以假设它处理单个雪崩,下面是要定义的操作。
GET :返回单个雪崩
员额:未使用
PUT:更新单个雪崩
删除:删除单个雪崩
现在我假设我们对控制器有明确的区分。在前面提到的OP中,可以有不同的GET操作,但它只返回单个Avalanche。因此,我将更改GET方法,以对象作为输入并检查值,即,
public class AvalanceRequest
{
public int? Id {get;set;}
public string Name {get;set;}
}
public class AvalancheDetailsController : ApiControllerBase
{
public Avalanche GET(AvalanceRequest request)
{
//write business logic based on parameters
if(request.Id.HasValue)
//return avalanche;
if(request.Name.IsNullOrEmpty())
//return avalanche
}
//other methods
}在处理URL时,我并没有真正使用WebAPI,而是尝试使用ServiceStack来开发REST服务。它允许独立于控制器名称附加url。
Url
api/Avalanche > AvalancheController (基于HttpVerb调用操作)
api/Avalanche/Id -> AvalancheDetailsController (基于HttpVerb调用操作)
我不知道在WebAPI中是否也可以附加url,否则就会有默认配置并调用via。api/Avalanche和api/AvalancheDetails/id
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);我为长时间的帖子感到抱歉,希望这是有意义的。
https://stackoverflow.com/questions/15402674
复制相似问题