Web api路由-无法访问默认路由
本文关键字:路由 访问 默认 api Web | 更新日期: 2023-09-27 18:29:25
我希望在我的web api中有以下路由:
/api/周/2013/08/29<--这是特定的一周
/api/周/<--这是的最后一周
{和一些到其他api控制器的默认路由}
我已经实现了一个Get函数,它可以正确地检索信息,但我在路由方面有问题。
我声明如下:
config.Routes.MapHttpRoute(
name: "WeekRoute",
routeTemplate: "api/week/{year}/{month}/{day}",
defaults: new { controller = "Week" },
constraints: new { year = @"'d{1,4}", month = @"[1-9]|1[0-2]", day = @"[0-9]|[0-2][0-9]|3[0-1]" }
);
// I don't think I'd even need this one, but I put it here for specificity
config.Routes.MapHttpRoute(
name: "DefaultWeek",
routeTemplate: "api/week",
defaults: new { controller = "Week", action="Get" }
);
config.Routes.MapHttpRoute(
name: "ApiDefault",
routeTemplate: "api/{controller}/{id}",
defaults: new { controller = "Week", id = RouteParameter.Optional }
);
我的行动:
[WeekFilter] // This filters out the year/month/day string and creates a DateTime
public IEnumerable<Week> Get(DateTime? week = null){...}
我已经试了一段时间了,但似乎无法让"/api/week/"的方法奏效。。我不认为我的操作有问题(或者它有一个可选参数),但路由似乎是错误的,但我不明白为什么。。。
谢谢你的帮助!
编辑:
WeekFilter:
public class WeekFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
var year = actionContext.ControllerContext.RouteData.Values["year"] as string;
var month = actionContext.ControllerContext.RouteData.Values["month"] as string;
if (!string.IsNullOrEmpty(year) && !string.IsNullOrEmpty(month))
{
var day = actionContext.ControllerContext.RouteData.Values["day"] as string;
if (string.IsNullOrEmpty(day))
day = "1";
var datum = new DateTime(int.Parse(year), int.Parse(month), int.Parse(day));
actionContext.ActionArguments["week"] = datum;
}
base.OnActionExecuting(actionContext);
}
}
行动:
[WeekFilter]
public IEnumerable<Week> Get(DateTime? week = null)
{
return HandlerLocator.GetQueryHandler<IGetWeeksDataHandler>().Execute(week);
}
通过将DateTime? week
参数更改为默认值null,您的两条路线都在工作:
[WeekFilter]
public IEnumerable<Week> Get(DateTime? week = null)
{
return null;
}
当您使用api/week
调用控制器时,操作方法上的周参数为null
。如果年和月为空,您可以通过修改WeekFilter
来初始化周来更改此设置。
如果用/api/week/2013/8/13
调用它,一切都会按预期工作。
我发现了我的错误。
在我的全球asax中,我有:
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
WebApiConfig.RegisterRoutes(GlobalConfiguration.Configuration);
BundleConfig.RegisterBundles(BundleTable.Bundles);
但显然网络的位置Api路由很重要,我把它改成了
WebApiConfig.RegisterRoutes(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
现在它起作用了!