我在我的web api项目上工作。
我在控制器中有两个get动作方法。
这里是控制器:
namespace Playground.Web.Controllers.API
{
[RoutePrefix("api/DamageEvent/{actionType}")]
public class DamageEventController : ApiController
{
#region API methods
[HttpGet]
public async Task<IHttpActionResult> GetDamageEvent(int damageEventId = 0)
{
//some logic
}
[HttpGet]
[Route("{ddd:int}")]
public async Task<IHttpActionResult> GetDamageEvent2(int ddd = 0)
{
//some logic
}
#endregion
}
}
这里WebApiConfig defenition:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Formatters.JsonFormatter.SerializerSettings.DateFormatString = "dd/MM/yyyy";
}
}
这里fiddler中的URL示例构成触发web api操作:
http://localhost/playground/api/DamageEvent/GetDamageEvent2/?ddd=22
我希望对于 GetDamageEvent2 网络API动作上面的网址将被触发。但是取而代之的是GetDamageEvent
动作方法。
为什么GetDamageEvent2没有被解雇?知道我缺少什么吗?
==============================的更新 ====== =======================
在 Nkosi
之后我回答了问题我对我的代码做了一些更改,我添加到WebApiConfig类新路由:
config.Routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这里是行动类型的变化:
namespace Playground.Web.Controllers.API
{
[RoutePrefix("api/DamageEvent")]
public class DamageEventController : ApiController
{
#region API methods
[HttpGet]
[Route("GetDamageEvent/{damageEventId}")]
public async Task<IHttpActionResult> GetDamageEvent(int damageEventId = 0)
{
//some logic
}
[HttpGet]
[Route("GetDamageEvent2/{ddd}")]
public async Task<IHttpActionResult> GetDamageEvent2(int ddd = 0)
{
//some logic
}
#endregion
}
}
在我进行上述更改之后,我尝试触发这两个操作并且它起作用。
但现在的问题是当我尝试在另一个控制器中调用另一个动作时,例如:
http://localhost/playground/api/Contracts/1
我收到404错误。
所以我猜错误是由于新的路线模板而发生的。
所以我的问题是如何修复上面的错误并仅在URI尝试访问DamageEventController时考虑新的路由模板?
答案 0 :(得分:1)
您正在混合属性路由和基于约定的路由。
与RoutePrefix
没有任何匹配,因为控制器中没有同时包含{actionType}
和 {ddd}
模板的操作。
但是您说明的网址......
api/DamageEvent/GetDamageEvent2/?ddd=22
...匹配路由表中DefaultApi
基于GetDamageEvent
约定的[RouteAttribute]
路由,因为它没有api/{controller=DamageEvent}/{id=GetDamageEvent2/?ddd=22}
并且默认返回约定...
/api/DamageEvent
/api/DamageEvent/1
/api/DamageEvent/GetDamageEvent2/?ddd=22
查看Routing in ASP.NET Web API以了解基于约定的路由。
以及Attribute Routing in ASP.NET Web API 2
路由表中的每个条目都包含一个路由模板。默认 Web API的路由模板是“api / {controller} / {id}”。在这 模板,“api”是文字路径段,{controller}和{id} 是占位符变量。
当Web API框架收到HTTP请求时,它会尝试匹配 路由表中的一个路由模板的URI。如果不 路由匹配,客户端收到404错误。例如, 以下URI与默认路由匹配:
{{1}}
找到匹配的路由后,Web API会选择控制器和 动作:
- 要查找控制器,Web API会将“Controller”添加到{controller}变量的值。
- 要查找操作,Web API会查看HTTP方法,然后查找名称以该HTTP方法名称开头的操作。对于 例如,通过GET请求,Web API会查找启动的操作 使用“Get ...”,例如“GetDamageEvent”。这个 约定仅适用于GET,POST,PUT和DELETE方法。您可以 通过使用控制器上的属性启用其他HTTP方法。 我们稍后会看到一个例子。
- 路径模板中的其他占位符变量(例如{id})将映射到操作参数。
要使您声明的路线正常工作,您需要更新路线模板。属性路由或将新的约定路由添加到路由表