AngularJS web api调用 - 无法在控制器上找到get方法

时间:2015-12-01 15:01:32

标签: angularjs asp.net-mvc-4 asp.net-web-api

我不能为我的生活理解为什么这不起作用。

我有一个简单的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);
}
});

2 个答案:

答案 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;
   }
}