asp.net-mvc - 传回多个服务uri

标签 asp.net-mvc asp.net-web-api

我创建了一个 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/

相关文章:

c# - WebAPI 路由到具有多个可选参数的函数

asp.net-mvc - 在 ASP.NET core 中指定路由的 Controller 命名空间

asp.net-mvc - 在 MVC4 中使用 JsonConvert.SerializeObject 清理输入?

c# - NHibernate - 延迟加载原始类型

c# - 检测到 ASP.NET MVC 5 危险的 Request.Path

azure - Service Fabric 服务中的多个通信监听器

javascript - 如何将 C# 字典传递给 typescript map

c# - HttpGet返回错误405

azure - 使用 WebApi 保护 Azure 存储中的文件访问

c# - 如何将 ENUM 值转换为 String 从 View 到 Controller