使用PUT的ASP.NET Web API路由
我正在尝试设置Web API路由,我认为这将是一件非常简单的事情.但是,似乎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} 解决方法
很高兴你找到了解决问题的方法.但我会根据我对REST服务的学习提供反馈. REST webservice的想法是将每个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:返回单雪崩 现在我假设我们对控制器之间有明确的区别.在您提到的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是否可以在WebAPI中同样附加,否则你最终会有默认配置并通过调用. api / Avalanche和api / AvalancheDetails / id. config.Routes.MapHttpRoute( name: "DefaultApi",defaults: new { id = RouteParameter.Optional } ); 我很抱歉很长的帖子,希望它有道理. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-core – ASP.NET vNext – 本地化(.resx)
- asp.net-core – dotnet publish不会发布正确的appsettings
- asp.net-core-mvc – MVC6路由到单页面应用程序而不会丢失4
- asp.net – 获取特定的会员提供商
- asp.net – dbo.TempGetStateItemExclusive3重复调用
- asp.net-mvc – 在VS 2012中创建和运行MVC 5项目
- asp.net-mvc – 由于已知在Cross Site Scripting攻击中使用
- asp.net – 使用asp:GridView进行分页时是否需要重新检索数
- 有没有办法在ASP.NET中访问当前会话的集合?
- ASP.NET Web应用程序死锁 – 认为它是由SQL Server锁定引起
- 表现 – 异步等待:他们不好吗?
- ASP.NET Identity简介及简单使用
- asp.net-mvc – 是否可以为post和get提供重复的动
- asp.net-mvc – ASP.NET MVC数据库本地化
- asp.net – 很好的复杂linq到sql示例?
- asp.net-mvc-3 – Windows Azure Web MVC应用程序
- asp.net-core – 如何在MVC Visual Studio 2015中
- asp.net-mvc – 我什么时候应该在asp.net mvc应用
- asp.net – RequiredFieldValidator必须单击两次
- asp.net – 使用Linq将单个值返回给SQL