WebAPI路由 - 完全动态的URL

时间:2013-01-30 11:23:14

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

我想定义两条路线。一个是对Web根目录的get请求,例如http://localhost,第二个是带有一个参数的get请求,例如http://localhost/{sport}。我可以让第一条路线正常工作,但不是第二条路线。我尝试了很多变化。这是其中之一:

using System.Collections.Generic;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Routing;

namespace PricingBridge.RestService
{
    public class RouteConfig
    {
        public static void RegisterRoutes(RouteCollection routes)
        {
            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapHttpRoute(
                name: "aRoute",
                routeTemplate: "{myParam}",
                defaults: new { controller = "My", myParam = UrlParameter.Optional });
        }
    }

    public class MyController : ApiController
    {
        public string Get()
        {
            return "1";
        }

        public string Get(string myParam)
        {
            return "2";
        }
    }
}

3 个答案:

答案 0 :(得分:3)

而不是UrlParameter.Optional,请使用RouteParameter.Optional

前者是MVC,后者是Web API。

答案 1 :(得分:0)

您的路由配置似乎很好。 尝试将UrlParameter更改为RouteParameter,当它无法帮助您尝试创建自己的控制器选择器进行诊断时,只是为了拦截以查看控制器在那里调用的内容。

var config = GlobalConfiguration.Configuration;
config.Services.Replace(typeof(IHttpControllerSelector), new MyControllerSelector(config))

或与动作选择器IHttpActionSelector相同。它可以让您查看为您的呼叫准确选择的控制器或操作。

答案 2 :(得分:0)

原来我使用了错误的课程。我应该在WebApiConfig中定义路由,而不是RouteConfig。

我的要求的解决方案如下(忽略返回值):

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute("DefaultApi", "{sport}", new { controller = "bridge", sport = RouteParameter.Optional });
        }
    }

    public class BridgeController : ApiController
    {
        public IEnumerable<RestItem> GetSports()
        {
            return new[] { new RestItem("sport1", "relation") };
        }

        public IEnumerable<RestItem> GetFixtures(string sport)
        {
            return new[] { new RestItem(sport + "/fixture", "relation") };
        }
    }