设置 WebApi 2 路由
Set WebApi 2 routes
我对 WepApi2 和创建 restfull web 服务相当陌生,但我掌握了大部分内容。
最近,我开始开发一个新的 WebApi2,我遇到了一些查询需要一些不可避免的字符,特别是斜杠和反斜杠的字符。
我在这里阅读了一些关于此事的教程和问题,但是 none 就足够了,所以我最终设置了这样的 api 查询
http://host/controler/action/?param1=x¶m2=y
一切都很完美。我必须为我的操作设置 ActionName
和 Route
属性,没问题,但是一旦我尝试了旧的查询方式
http://host/controller/action/x/y
我总是会得到 No action was found on the controller 'Controller' that matches the request.
这是我的路由配置
// Web API configuration and services
config.MapHttpAttributeRoutes();
// Web API routes
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { controller = "HelloWorld", id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "Config1",
routeTemplate: "{controller}/{action}/{param1}/{param2}/{param3}",
defaults: new { controller = "Controller", action = "action", param2 = RouteParameter.Optional, param3 = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "Config2",
routeTemplate: "{controller}/{param1}/{param2}/{param3}",
defaults: new { controller = "action", param3 = RouteParameter.Optional }
);
您可能注意到我有两种配置。好吧,首先是将操作归类到控制器下,这样,将来可以添加更多具有特定操作的控制器,而不是拥有大量具有特定操作的控制器,但是第二种方法是客户想要的.
那么,有没有办法让这两种方式一起工作??
编辑:不好意思,我忘了展示我的控制器和操作是如何设置的
public class ControllerController : WebApiController
{
[Route("Controller/action1/")]
[ActionName("action1")]
[HttpGet()]
public Object action1(string param1, string param2)
{
// do action actions code
return result;
}
如您所见,除了在配置中设置路由外,我还设置了动作路由属性,但我不知道我可以设置超过 1 个路由属性。将尝试并报告回来!
您可以尝试使用 attribute routing 代替:
// in your startup configuration:
config.MapHttpAttributeRoutes();
// and your controller:
[RoutePrefix("foo")]
public class FooController
{
[HttpGet]
[Route("bar/{param1}/{param2}")]
[Route("bar")
public IHttpActionResult GetBar(string param1, string param2)
{
// ...
}
}
我对 WepApi2 和创建 restfull web 服务相当陌生,但我掌握了大部分内容。
最近,我开始开发一个新的 WebApi2,我遇到了一些查询需要一些不可避免的字符,特别是斜杠和反斜杠的字符。
我在这里阅读了一些关于此事的教程和问题,但是 none 就足够了,所以我最终设置了这样的 api 查询
http://host/controler/action/?param1=x¶m2=y
一切都很完美。我必须为我的操作设置 ActionName
和 Route
属性,没问题,但是一旦我尝试了旧的查询方式
http://host/controller/action/x/y
我总是会得到 No action was found on the controller 'Controller' that matches the request.
这是我的路由配置
// Web API configuration and services
config.MapHttpAttributeRoutes();
// Web API routes
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { controller = "HelloWorld", id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "Config1",
routeTemplate: "{controller}/{action}/{param1}/{param2}/{param3}",
defaults: new { controller = "Controller", action = "action", param2 = RouteParameter.Optional, param3 = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "Config2",
routeTemplate: "{controller}/{param1}/{param2}/{param3}",
defaults: new { controller = "action", param3 = RouteParameter.Optional }
);
您可能注意到我有两种配置。好吧,首先是将操作归类到控制器下,这样,将来可以添加更多具有特定操作的控制器,而不是拥有大量具有特定操作的控制器,但是第二种方法是客户想要的.
那么,有没有办法让这两种方式一起工作??
编辑:不好意思,我忘了展示我的控制器和操作是如何设置的
public class ControllerController : WebApiController
{
[Route("Controller/action1/")]
[ActionName("action1")]
[HttpGet()]
public Object action1(string param1, string param2)
{
// do action actions code
return result;
}
如您所见,除了在配置中设置路由外,我还设置了动作路由属性,但我不知道我可以设置超过 1 个路由属性。将尝试并报告回来!
您可以尝试使用 attribute routing 代替:
// in your startup configuration:
config.MapHttpAttributeRoutes();
// and your controller:
[RoutePrefix("foo")]
public class FooController
{
[HttpGet]
[Route("bar/{param1}/{param2}")]
[Route("bar")
public IHttpActionResult GetBar(string param1, string param2)
{
// ...
}
}