【问题标题】:WebAPI Routing AssistanceWebAPI 路由协助
【发布时间】:2012-11-30 00:06:50
【问题描述】:

学习了很多关于 MapRouting 的知识,并且花了太多时间试图完成我需要做的事情,所以我希望有人能帮忙。 :)

我希望做以下事情:

/api/Entities/1 (这是一个字符串,不是int)

/api/Entities/1/Action

/api/Entities

/api/Entities/Action

我遇到的问题是最后一个。目前正在被第一种情况拦截,因为 id 是一个字符串。

任何帮助将不胜感激!

【问题讨论】:

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


    【解决方案1】:

    一个很好的参考是here

    如果不使用Attribute based routing,答案会有些冗长,因为如果您匹配同一个动词,RPC 样式(Action)和 Rest 方法就不能很好地共存。正如您所注意到的,GET() 和 DOSOMETHING() 被视为同一控制器上的重复方法签名。为了解决这个问题,您可以尝试使用两个控制器:

    所以我建议使用attribute based 路由;但是,使用普通方法是可能的:

    使用标准路由...

    这样设置你的路线

            config.Routes.MapHttpRoute(
                    name: "DefaultApi",
                    routeTemplate: "api/{controller}/{id}",
                    defaults: new { id = RouteParameter.Optional }
                );
            config.Routes.MapHttpRoute(
                name: "ActionDefaultApi",
                routeTemplate: "api/entities/{action}/{actionId}",
                defaults: new
                              {
                                  //Add more as needed
                                  action = "(|dosomething|dosomethingelse)",
                                  actionId = RouteParameter.Optional,
                                  controller = "EntitiesRpc"
                              });
    

    控制器 1:

    public class EntitiesController : ApiController
    {
        public string Get()
        {
            return "http://server/api/Entities";
        }
    
        public string Get(string id)
        {
            return string.Format("http://server/api/Entities/{0}", id);
        }
    }
    

    控制器 2:

    public class EntitiesRpcController : ApiController
    {
        [HttpGet]
        public string DoSomething()
        {
            return "http://server/api/Entities/doSomething";
        }
    
        [HttpGet]
        public string DoSomething(string actionId)
        {
            return string.Format("http://server/api/Entities/doSomething/{0}", actionId);
        }
    
        [HttpGet]
        public string DoSomethingElse()
        {
            return "http://server/api/Entities/doSomethingelse";
        }
    
        [HttpGet]
        public string DoSomethingElse(string actionId)
        {
            return string.Format("http://server/api/Entities/doSomethingelse/{0}", actionId);
        }
    }
    

    现在假设您使用基于属性的路由,您可以返回到一个控制器并使用以下内容:

    public class EntitiesController : ApiController
    {
        [Get("Entities")]
        public string Get()
        {
            return "http://server/api/Entities";
        }
    
        [Get("Entities/{id}")]
        public string Get(string id)
        {
            return string.Format("http://server/api/Entities/{0}", id);
        }
    
        [Get("Entities/doSomething")]
        public string DoSomething()
        {
            return "http://server/api/Entities/doSomething";
        }
    
        [Get("Entities/doSomething/{actionId}")]
        public string DoSomething(string actionId)
        {
            return string.Format("http://server/api/Entities/doSomething/{0}", actionId);
        }
    
        [Get("Entities/doSomethingelse")]
        public string DoSomethingElse()
        {
            return "http://server/api/Entities/doSomethingelse";
        }
    
        [Get("Entities/doSomethingelse/{actionId}")]
        public string DoSomethingElse(string actionId)
        {
            return string.Format("http://server/api/Entities/doSomethingelse/{0}", actionId);
        }
    }
    

    【讨论】:

    • AttributeRouting.net 确实是答案。非常非常非常酷。 :)
    • @MichaelDBang 很高兴它有帮助。如果您对此感到满意,您也可以接受答案吗?
    • 啊……真是个新手。我试图“提升”它,但它不允许我......没有看到复选框。所以你去吧!再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    相关资源
    最近更新 更多