加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

使用PUT的ASP.NET Web API路由

发布时间:2020-12-16 09:38:41 所属栏目:asp.Net 来源:网络整理
导读:我正在尝试设置Web API路由,我认为这将是一件非常简单的事情.但是,似乎Web API中的路由与不同的HTTP谓词不一致.假设这个控制器有这些动作…… public class AvalancheController : ApiControllerBase{ // GET api/avalanche public IEnumerableAvalanche Get
我正在尝试设置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:返回所有雪崩
POST:插入新的雪崩
PUT:没用过
删除:未使用

AvalancheDetailsController

public class AvalancheDetailsController : ApiControllerBase
{
    public Avalanche GET(int id)
    {

    } 


    public int PUT(int id)
    {

    }

    public int DELETE(int id)
    {

    }
}

可以假设处理单个雪崩,下面是要定义的操作.

GET:返回单雪崩
POST:没用过
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独立于控制器名称.

网址
api / Avalanche – > AvalancheController(基于HttpVerb调用操作)
api / Avalanche / Id – > AvalancheDetailsController(基于HttpVerb调用操作)

我不知道url是否可以在WebAPI中同样附加,否则你最终会有默认配置并通过调用. api / Avalanche和api / AvalancheDetails / id.

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

我很抱歉很长的帖子,希望它有道理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读