Asp.net web api 触发web api操作方法的疑难解答
我从事我的web api项目 我在控制器中有两个get动作方法 这里是控制器:Asp.net web api 触发web api操作方法的疑难解答,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,Asp.net Web Api,Asp.net Web Api2,Asp.net Web Api Routing,我从事我的web api项目 我在控制器中有两个get动作方法 这里是控制器: namespace Playground.Web.Controllers.API { [RoutePrefix("api/DamageEvent/{actionType}")] public class DamageEventController : ApiController { #region API methods [HttpGet] pu
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
}
}
下面是fiddler compose中触发web api操作的URL示例:
http://localhost/playground/api/DamageEvent/GetDamageEvent2/?ddd=22
我希望对于上面的URL,GetDamageEvent2WebAPI操作将被触发。而是触发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
}
}
我得到404错误
因此,我猜发生错误是因为新的路由模板
因此,我的问题是,如何修复上述错误,并仅在URI尝试访问DamageEventController时才考虑新路由模板 您正在混合属性路由和基于约定的路由 没有任何内容与您的
RoutePrefix
匹配,因为控制器中没有同时具有{actionType}
和{ddd}
模板的操作
但是你声明的URL
api/DamageEvent/GetDamageEvent2/?ddd=22
…为路由表中的GetDamageEvent
匹配基于约定的路由DefaultApi
,因为它没有[RouteAttribute]
,并且默认返回约定,其中
api/{controller=DamageEvent}/{id=GetDamageEvent2/?ddd=22}
请查看以了解基于约定的路由
而且
路由表中的每个条目都包含一个路由模板。默认值
Web API的路由模板是“API/{controller}/{id}”。在这个
模板,“api”是一个文本路径段,{controller}和{id}
是占位符变量
当WebAPI框架收到HTTP请求时,它会尝试匹配
路由表中某个路由模板的URI。如果没有
如果路由匹配,客户端将收到404错误。例如
以下URI与默认路由匹配:
一旦找到匹配的路由,Web API将选择控制器和
行动:
- 为了找到控制器,Web API将“controller”添加到{controller}变量的值中
- 要查找该操作,Web API将查看HTTP方法,然后查找名称以该HTTP方法名称开头的操作。对于 例如,通过GET请求,Web API查找启动的操作 使用“Get…”,例如“GetDamageEvent”。这 约定仅适用于GET、POST、PUT和DELETE方法。你可以 通过使用控制器上的属性启用其他HTTP方法。 稍后我们将看到一个例子
- 路由模板中的其他占位符变量(如{id})映射到操作参数
要使您指定的路线正常工作,您需要更新路线模板。属性路由或向路由表中添加新的约定路由您必须向控制器显示该路由不工作,否则我们将对其不工作的原因进行假设。好的,我重新阅读了新问题,这可能是您的路由的订购问题。框架使用第一个匹配的路由。尝试切换两个基于约定的路由的顺序。@Nkosi,我切换了路由顺序模板。当我尝试访问DamageEvent控制器时,我收到405错误。您添加的新约定路由。除了
DamageEventController
之外,您还需要它吗?如果没有,您可以安全地删除该路由并保留默认路由,因为DamageEventController
完全使用属性路由。@您是指WebApiConfig中的actionAPI?谢谢您的回答。它帮助我理解了一些要点。但不幸的是,在添加新路由模板时,其他控制器中的其他操作的其他URI查询会带来麻烦。我更新了我的问题。请检查我的更新。
api/DamageEvent/GetDamageEvent2/?ddd=22
api/{controller=DamageEvent}/{id=GetDamageEvent2/?ddd=22}
/api/DamageEvent
/api/DamageEvent/1
/api/DamageEvent/GetDamageEvent2/?ddd=22