首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于PUT的ASP.NET网络API路由

基于PUT的ASP.NET网络API路由
EN

Stack Overflow用户
提问于 2013-03-14 06:31:23
回答 1查看 4.3K关注 0票数 4

我正在尝试设置Web路由,因为我认为这是一件非常简单的事情。但是,Web API中的路由似乎与不同的HTTP谓词不一致。假设我有这个控制器有这些动作。

代码语言:javascript
复制
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) {}
}

我已经确定了以下路线..。

代码语言:javascript
复制
    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 }
    );

然后我得到了以下的路线.

代码语言:javascript
复制
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路由。如果您对如何修改这些路由有任何建议,那么我就不需要为每个控制器指定操作名称提供一条路由,这也将是非常棒的。

谢谢!

伊恩

编辑:我今天早上注意到,下面的路线也没有被定义。

代码语言:javascript
复制
GET api/Avalanche/{id}
EN

回答 1

Stack Overflow用户

发布于 2013-03-14 16:06:40

很高兴你找到了解决问题的办法。但是我会根据我的学习提供我的反馈和休息服务。resource的思想是将每个url解析为一个资源(或者实体),并根据HttpVerb决定操作。在这种情况下,您有三个GET操作,这与您的修改很好。

但我认为控制器也可以重新安排,使之具有单一的GET操作和单一的责任,从而更好地维护性。前任:

AvalancheController

代码语言:javascript
复制
public class AvalancheController : ApiControllerBase
{
    public IEnumerable<Avalanche> GET()
    {

    }

    public void POST(Avalanche avalanche)
    {

    }
}

可以假设它处理顶级的所有雪崩,下面是要定义的操作。

GET :返回所有雪崩

邮寄:插入新雪崩

放置:未使用

删除:未使用

AvalancheDetailsController

代码语言:javascript
复制
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方法,以对象作为输入并检查值,即,

代码语言:javascript
复制
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

代码语言:javascript
复制
 config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{id}",
        defaults: new { id = RouteParameter.Optional }
    );

我为长时间的帖子感到抱歉,希望这是有意义的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15402674

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档