【发布时间】:2015-12-02 00:07:51
【问题描述】:
我一生都无法理解为什么这不起作用。
我有一个简单的 ASP.Net MVC Web API 控制器,有 2 个 get 方法。我有一个具有 2 个相应功能的 AngularJS 服务。 GetAllRisks 运行良好。但是,GetRiskByID 会返回一条错误消息,指出“未找到与请求匹配的 HTTP 请求“http://localhost:49376/api/RiskApi/GetRiskByID/6”和“在与请求匹配的 RiskApi 控制器上找不到任何操作。”
URL 被正确传递。我尝试了 API 路由的各种选项,但无处可去。我确定我错过了一些简单但看不到的东西。
如果有任何想法,我将不胜感激。
谢谢,
灰
RiskApiController
public class RiskApiController : ApiController
{
private readonly IRiskDataService _riskDataService;
public RiskApiController(IRiskDataService riskDataService)
{
_riskDataService = riskDataService;
}
// GET api/RiskApi
[HttpGet]
public IEnumerable<IRisk> GetAllRisks()
{
return _riskDataService.GetAllRisks().Take(20);
}
// GET api/RiskApi/5
[HttpGet]
public IRisk GetRiskByID(int riskID)
{
IRisk risk = _riskDataService.GetRiskByID(riskID);
if (risk == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return risk;
}
}
service.js
app.service('OpenBoxExtraService', function ($http) {
//Get All Risks
this.getAllRisks = function () {
return $http.get("/api/RiskApi/GetAllRisks");
}
//Get Single Risk by ID
this.getRisk = function (riskID) {
var url = "/api/RiskApi/GetRiskByID/" + riskID;
return $http.get(url);
}
});
WebApiConfig
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "ActionRoute",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
【问题讨论】:
-
[路过...您可能还有另一层问题,但这对我来说很突出] 您不能为 HttpRouteCollection 提供多个具有相同名称的路由。将第二条路线的名称值从“DefaultApi”更改为“Foo”,它可能会起作用。
-
好吧....您的可选 routeParameters 将发生冲突。如果提供
/api/RiskApi/foo,应该选择哪条路线?它将匹配 api/{controller}/{id} 以及 api/{controller}/{action}/{id} 路由,因为您在两者上都有 {id} 可选。路由器将无法判断 foo 是 {id} 还是 {action} 值。它自然无法将“foo”作为 id 的 int 发送,但我不确定路由器是否足够智能以推断基于 {action} 的路由是您想要的路由。我认为它只是无法路由。 -
我不确定您所说的具有相同名称的路由是什么意思,因为它们具有不同的名称(ActionRoute 和 DeafultApi)。我同意你关于冲突的观点,但认为这可能会表现在可能选择错误的路线上,而不是根本找不到路线。我将研究 RoutingAttributes。谢谢指点。
-
...哇哦。当我写评论时,我将这两个路由名称都读为“DefaultApi”。
-
...那么,这是新开发者吗?除非您要维护现有的第一代 Web API 产品,否则在第一代 Web API 和 MVC 4 上构建它并没有什么意义。为什么您决定将您的系统锚定为过时的技术?只是因为你想用VS2010吗?
标签: angularjs asp.net-mvc-4 asp.net-web-api