C# WebApi Controller(States Controller目前有2个Get方法,1个returns List,第二个returns Single Item)
C# WebApi Controller (States Controller Currently has 2 Get methods, 1 returns List, the second returns Single Item)
我的 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 }
);
}
}
我的控制器 Get 方法返回项目列表:
[EnableQuery]
public IQueryable<ProvinceState> Get()
{
return db.ProvinceStates;
}
我的控制器 Get 方法返回单个项目:
[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 方法 returns 状态列表正确地没有任何问题。
- 但是当我发出请求 LocalHost:###/States('AL') 以取回特定项目时,我收到以下错误。
HTTP 错误 404.0 - 未找到
您要查找的资源已被删除、更名或暂时不可用。
调试时,在向 returns 单个项目的 get 方法发出请求时,调试器不会为单个项目 GET 设置断点。但是在请求 List GET 方法时它确实如此。
任何建议或帮助将不胜感激,在此先感谢。
由于您有一个由 ProvinceStateCode
和 CountryCode
组成的复合键,您需要修改 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')
我的 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 }
);
}
}
我的控制器 Get 方法返回项目列表:
[EnableQuery]
public IQueryable<ProvinceState> Get()
{
return db.ProvinceStates;
}
我的控制器 Get 方法返回单个项目:
[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 方法 returns 状态列表正确地没有任何问题。
- 但是当我发出请求 LocalHost:###/States('AL') 以取回特定项目时,我收到以下错误。
HTTP 错误 404.0 - 未找到
您要查找的资源已被删除、更名或暂时不可用。
调试时,在向 returns 单个项目的 get 方法发出请求时,调试器不会为单个项目 GET 设置断点。但是在请求 List GET 方法时它确实如此。
任何建议或帮助将不胜感激,在此先感谢。
由于您有一个由 ProvinceStateCode
和 CountryCode
组成的复合键,您需要修改 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')