繁体   English   中英

使用PUT的ASP.NET Web API路由

[英]ASP.NET Web API Routing with PUT

我正在尝试设置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",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

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

暂无
暂无

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

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