我创建了一个 asp.net web api 2 Controller 来管理逻辑 Assets 。像往常一样,帖子创建它并将 uri 返回到 Assets ,删除将其删除,但我有 2 个 puts 对 Assets 执行单独的操作,所以我的代码如下所示:
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();
}
}
为了让路由理解这一点,我的路由规则是(包括默认规则):
config.Routes.MapHttpRoute(name: "ActionApi", routeTemplate: "api/{controller}/{action}/{id}");
config.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional });
这是有效的,感觉就像系统按操作巧妙地分离了放置代码,并确保系统将拒绝我们不支持的操作请求。
问题在于,通过 post 创建 Assets 的客户端不知道放置(操作)uri 是什么,就像它通过从 post 返回的位置 header 对 Assets uri 所做的那样。如果我们将来更改 uri 形式,客户端将中断,因为他们将手动创建 uri。
从帖子返回多个服务点 uri 的正确方法是什么,或者只是更好地执行上述操作。
最佳答案
使用 Route 来区分 Action 。
例如:
[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();
}
}
然后在 webapiconfig.cs 中启用属性路由
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
// Other Web API configuration not shown.
}
}
最后,在您的客户端中,您可以区分放置 URI,如下所示:
http(s):///api/Admin/ActionA
http(s):///api/Admin/ActionB
关于asp.net-mvc - 传回多个服务uri,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41102916/