我想定义两条路线。一个是对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";
}
}
}
答案 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") };
}
}