【发布时间】:2016-08-22 11:36:26
【问题描述】:
我在做我的 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定义:
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 compose 中触发 web api 动作的 URL 示例:
http://localhost/playground/api/DamageEvent/GetDamageEvent2/?ddd=22
我希望 GetDamageEvent2 web api 操作对于上面的 URL 将被触发。但是GetDamageEvent action 方法被触发了。
为什么没有触发 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 时才考虑新的路由模板?
【问题讨论】:
-
您必须向控制器展示不工作的情况,否则我们将假设它为什么不工作。
-
好的,我重新阅读了新问题,这可能是您路线的订购问题。框架使用第一个匹配的路由。尝试切换两个基于约定的路线的顺序。
-
@Nkosi ,我切换了路由顺序模板。当我尝试访问 DamageEvent 控制器时,我收到 405 错误。
-
您添加的新会议路线。除了
DamageEventController,您还需要它吗?如果没有,那么您可以安全地删除该路由并保留您的默认值,因为DamageEventController正在完全使用属性路由。 -
@Nkosi 你的意思是来自 WebApiConfig 的 actionAPI?
标签: asp.net-web-api asp.net-web-api2 asp.net-web-api-routing