传回多个服务uris

Joh*_*ebs 7 asp.net-mvc asp.net-web-api

我创建了一个asp.net web api 2控制器来管理逻辑资产.像往常一样,帖子创建它并将uri返回到资源,删除删除它,但我有2个put来对资产执行单独的操作,所以我的代码如下所示:

public class Controller : ApiController
{        
    public IHttpActionResult Post(Stuff stuff)
    {
        var id = CreateNewStuff(stuff);

        return CreatedAtRoute("DefaultApi", new { id = this.id }, id);
    }   

    [HttpPut]
    public IHttpActionResult ActionA(int id, ActionAStuff stuff)
    {    
        // Perform action A

        return Ok();
    }   

    [HttpPut]
    public IHttpActionResult ActionB(int id, ActionBStuff stuff)
    {    
        // Perform action B

        return Ok();
    }   

    public IHttpActionResult Delete(int id)
    {
        // Delete the asset

        return Ok();
    }  
}
Run Code Online (Sandbox Code Playgroud)

为了让路由理解这一点,我的路由规则是(包括默认规则):

config.Routes.MapHttpRoute(name: "ActionApi", routeTemplate: "api/{controller}/{action}/{id}");
config.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional });
Run Code Online (Sandbox Code Playgroud)

这可以工作,感觉就像系统通过操作巧妙地分离put代码,并确保系统拒绝我们不支持的操作请求.

问题是通过post创建资产的客户端不知道put(action)uris是什么,就像它通过post发回的位置头对资产uri所做的那样.如果我们将来更改uri表单,客户端会因为手动创建uris而中断.

从帖子返回多个服务点uris的正确方法是什么,或者只是更好地执行上述操作.

Kal*_*yan 1

使用 Route 来区分操作。例如:

[RoutePrefix("api/Admin")]
public class Controller : ApiController
{        
    [Route("ActionA")
    [HttpPut]
    public IHttpActionResult ActionA(int id, ActionAStuff stuff)
    {    
        // Perform action A

        return Ok();
    }   

    [Route("ActionB")
    [HttpPut]
    public IHttpActionResult ActionB(int id, ActionBStuff stuff)
    {    
        // Perform action B

        return Ok();
    }   

}
Run Code Online (Sandbox Code Playgroud)

然后在 webapiconfig.cs 中启用属性路由

public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();

            // Other Web API configuration not shown.
        }
    }
Run Code Online (Sandbox Code Playgroud)

最后,在您的客户端中,您可以区分放置 URI,如下所示:http(s):///api/Admin/ActionA

http(s):///api/Admin/ActionB