排除故障以触发web api操作方法

时间:2016-04-27 22:42:36

标签: 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]
        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时考虑新的路由模板?

1 个答案:

答案 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})将映射到操作参数。
  •   

要使您声明的路线正常工作,您需要更新路线模板。属性路由或将新的约定路由添加到路由表