我不能为我的生活理解为什么这不起作用。
我有一个简单的ASP.Net MVC Web API控制器,有2个get方法。我有一个带有2个相应功能的AngularJS服务。 GetAllRisks运行良好。但是,GetRiskByID返回时出现错误,提示"未找到与请求匹配的HTTP请求" http://localhost:49376/api/RiskApi/GetRiskByID/6"和"在RiskApi控制器上找不到与请求匹配的操作。"
正确传递了URL。我已经尝试了各种API路由选项,但无法实现。我确信我错过了一些简单但却看不到的东西。
我真的很感激任何想法。
谢谢,
灰
RiskApiController
<a href="@Url.Action("Vtd", "Crs", new { Text= Html.Encode("How it works"}, null })">
How do <i>This</i>
</a>
service.js
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;
}
}
WebApiConfig
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);
}
});
答案 0 :(得分:3)
尝试将WebApiConfig类更改为:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
并将您的参数:riskID
更改为id
。
// GET: api/RiskApi/GetRiskByID/5
[HttpGet]
public IRisk GetRiskByID(int id)
{
IRisk risk = _riskDataService.GetRiskByID(id);
if (risk == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return risk;
}
然后,您可以使用:
// GET: api/RiskApi/GetAllRisks
// GET: api/RiskApi/GetRiskByID/5
答案 1 :(得分:0)
...尝试查看配置的HttpRoute
映射,并使用属性引入路由映射。
由于这是第一代Web API,您需要引入 AttributeRouting.WebAPI NuGet包,并且您可能想要引用here(strathweb)关于如何实施的直接指导。
请注意,您在{id}
参数的当前实现中存在映射问题:您在路由配置中将其声明为id,但随后在控制器内将其标识为riskID
&#39方法;这些需要匹配。切换控制器的方法,使其传入的routeParameter命名为id
。您可以选择切换配置以在路由中声明{riskID}
参数,但这会将您的全局配置与特定控制器的语义耦合,并且您可能需要实现更多路由约束以使其他控制器未命名&#34;风险&#34;合理。
public class RiskApiController : ApiController
{
private readonly IRiskDataService _riskDataService;
public RiskApiController(IRiskDataService riskDataService)
{
_riskDataService = riskDataService;
}
// GET api/RiskApi
[HttpGet]
[Route("api/RiskApi")]
public IEnumerable<IRisk> GetAllRisks()
{
return _riskDataService.GetAllRisks().Take(20);
}
// GET api/RiskApi/5
[HttpGet]
[Route("api/RiskApi/{id}")]
public IRisk GetRiskByID(int id)
{
IRisk risk = _riskDataService.GetRiskByID(id);
if (risk == null)
{
throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
}
return risk;
}
}