C#WebApi控制器(States Controller当前有2个Get方法,1个返回List,第二个返回Single



我的WebApiConfig:

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            // Web API routes
            config.MapHttpAttributeRoutes();

            ODataModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<Applicant>("Applicants");
            builder.EntitySet<Country>("Countries");
            builder.EntitySet<Program>("Programs");
            builder.EntitySet<Campus>("Campuses");
            builder.EntitySet<AcademicYear>("AcademicYears");
            builder.EntitySet<Citizenship>("Citizenships");
            builder.EntitySet<ProgramChoice>("ProgramChoices");
            builder.EntitySet<Application>("Applications");
            builder.EntitySet<ProvinceState>("States");
            config.MapODataServiceRoute(
              routeName: "ODataRoute",
              routePrefix: null,
              model: builder.GetEdmModel());


            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{key}",
                defaults: new { key = RouteParameter.Optional }
            );
        }
    }

我的控制器获取返回项目列表的方法:

   [EnableQuery]
        public IQueryable<ProvinceState> Get()
        {
            return db.ProvinceStates;
        }

我的控制器获取返回单个项目的方法:

[EnableQuery]
public SingleResult<ProvinceState> Get([FromODataUri] string key)
{
    IQueryable<ProvinceState> result = db.ProvinceStates.Where(c => c.ProvinceStateCode == key);
    return SingleResult.Create(result);
}

问题如下:

  • 当我请求LocalHost:###/States时,Get方法会正确地返回状态列表,而不会出现任何问题
  • 但是,当我请求LocalHost:###/States('AL')以取回特定项目时,我会收到以下错误

HTTP错误404.0-找不到

您要查找的资源已被删除、名称已更改或暂时不可用

调试时,在向返回单个项的get方法发出请求时,调试器不会达到单个项get的断点。但是它在请求ListGET方法时确实如此。

如有任何建议或帮助,我们将不胜感激,并提前表示感谢。

由于您有一个由ProvinceStateCodeCountryCode组成的复合键,因此需要修改Get方法以接受这两个值。

[HttpGet]
[ODataRoute("States(ProvinceStateCode={stateCode},CountryCode={countryCode})")]
[EnableQuery]
public IHttpActionResult Get([FromODataUri] string stateCode, [FromODataUri] string countryCode)
{
    var result = db.ProvinceStates.FirstOrDefault(c => c.ProvinceStateCode == stateCode && c.CountryCode == countryCode);
    if (result == null)
    {
        return NotFound();
    }
    else
    {
        return Ok(result);
    }
}

然后按如下方式检索各个状态:

GET http://host/States(ProvinceStateCode='AL',CountryCode='US')

最新更新