Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WebApi控制器(状态控制器当前有2个Get方法,1个返回列表,第二个返回单个项)_C#_Asp.net_Asp.net Web Api_Odata_Asp.net Web Api Routing - Fatal编程技术网

C#WebApi控制器(状态控制器当前有2个Get方法,1个返回列表,第二个返回单个项)

C#WebApi控制器(状态控制器当前有2个Get方法,1个返回列表,第二个返回单个项),c#,asp.net,asp.net-web-api,odata,asp.net-web-api-routing,C#,Asp.net,Asp.net Web Api,Odata,Asp.net Web Api Routing,我的网站配置: public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API configuration and services // Web API routes config.MapHttpAttributeRoutes();

我的网站配置:

 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 }
            );
        }
    }
公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
//Web API配置和服务
//Web API路由
config.maphttpAttribute路由();
ODataModelBuilder=新ODataConventionModelBuilder();
建造商实体集(“申请人”);
建筑商实体集(“国家”);
builder.EntitySet(“程序”);
建筑商。实体集(“校园”);
建筑商实体集(“学术年”);
建造商实体集(“公民身份”);
builder.EntitySet(“程序选项”);
builder.EntitySet(“应用程序”);
建筑商实体集(“州”);
config.MapODataServiceRoute(
routeName:“ODataRoute”,
routePrefix:null,
模型:builder.GetEdmModel());
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}/{key}”,
默认值:新建{key=RouteParameter.Optional}
);
}
}
My Controller Get方法返回项目列表:

   [EnableQuery]
        public IQueryable<ProvinceState> Get()
        {
            return db.ProvinceStates;
        }
[启用查询]
公共IQueryable Get()
{
返回db.ProvinceStates;
}
My Controller Get方法返回单个项:

[EnableQuery]
public SingleResult<ProvinceState> Get([FromODataUri] string key)
{
    IQueryable<ProvinceState> result = db.ProvinceStates.Where(c => c.ProvinceStateCode == key);
    return SingleResult.Create(result);
}
[启用查询]
公共SingleResult获取([FromODataUri]字符串键)
{
IQueryable result=db.ProvinceStates.Where(c=>c.ProvinceStateCode==key);
返回SingleResult.Create(结果);
}
问题如下:

GET http://host/States(ProvinceStateCode='AL',CountryCode='US')
  • 当我请求LocalHost:####/States时,Get方法正确地返回状态列表,没有任何问题
  • 但是当我请求LocalHost:####/States('AL')时,为了取回特定的项,我会得到以下错误

HTTP错误404.0-找不到

您正在查找的资源已被删除、名称已更改或暂时不可用。 调试时,以及向返回单个项的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')

请发布
$metatdata
ProvinceState
的类定义,以显示复合键。太好了!!真不敢相信我错过了这个,我猜是通过控制器粘贴的懒惰副本造成的。我真的很感谢你的帮助,很好的反馈,谢谢你