Asp.net web api 触发web api操作方法的疑难解答

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

我从事我的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
    }
}
下面是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