2016-12-19 16 views
0

I '는 URI에서 매개 변수를 받아 다음과 같은 웹 API를 하나로, OData 컨트롤러 방법 호출 시도 :웹을 찾을 수 없습니다

// GET /odata/People(3) 
    public SingleResult<Person> Get([FromODataUri] int key) 
    { 
     return SingleResult.Create(DemoDataSources.Instance.People.Where(p => p.ID == key.ToString()).AsQueryable()); 
    } 

방법은 위의 박히는되지 않습니다 url http://localhost:port/odata/People(3) 항상 404를 찾을 수 없음.

나는 다음과 같은 파일과 함께 처음부터 새 Asp.Net 중 하나로, OData 웹 응용 프로그램을 구성했습니다

:

PeopleController.cs

[EnableQuery] 
public class PeopleController : ODataController 
{ 

    // GET /odata/People 
    public IHttpActionResult Get() 
    { 
     return Ok(DemoDataSources.Instance.People.AsQueryable()); 
    } 

    // GET /odata/People(3) 
    public SingleResult<Person> Get([FromODataUri] int key) 
    { 
     return SingleResult.Create(DemoDataSources.Instance.People.Where(p => p.ID == key.ToString()).AsQueryable()); 
    } 
} 

WebApiConfig.cs

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 
     // Configure Web API to use only bearer token authentication. 
     config.SuppressDefaultHostAuthentication(); 
     config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 

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

     config.MapODataServiceRoute("odata", "odata", GetEdmModel(), new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer)); 
     config.EnsureInitialized(); 
    } 

    private static IEdmModel GetEdmModel() 
    { 
     ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); 
     builder.Namespace = "Demos"; 
     builder.ContainerName = "DefaultContainer"; 
     builder.EntitySet<Person>("People"); 
     builder.EntitySet<Trip>("Trips"); 
     var edmModel = builder.GetEdmModel(); 
     return edmModel; 
    } 
} 

DemoDataSources.cs

public class DemoDataSources 
{ 
    private static DemoDataSources instance = null; 
    public static DemoDataSources Instance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new DemoDataSources(); 
      } 
      return instance; 
     } 
    } 
    public List<Person> People { get; set; } 
    public List<Trip> Trips { get; set; } 
    private DemoDataSources() 
    { 
     this.Reset(); 
     this.Initialize(); 
    } 
    public void Reset() 
    { 
     this.People = new List<Person>(); 
     this.Trips = new List<Trip>(); 
    } 
    public void Initialize() 
    { 
     this.Trips.AddRange(new List<Trip>() 
     { 
      new Trip() 
      { 
       ID = "0", 
       Name = "Trip 0" 
      }, 
      new Trip() 
      { 
       ID = "1", 
       Name = "Trip 1" 
      }, 
      new Trip() 
      { 
       ID = "2", 
       Name = "Trip 2" 
      }, 
      new Trip() 
      { 
       ID = "3", 
       Name = "Trip 3" 
      } 
     }); 
     this.People.AddRange(new List<Person> 
     { 
      new Person() 
      { 
       ID = "001", 
       Name = "Angel", 
       Trips = new List<Trip>{Trips[0], Trips[1]} 
      }, 
      new Person() 
      { 
       ID = "002", 
       Name = "Clyde", 
       Description = "Contrary to popular belief, Lorem Ipsum is not simply random text.", 
       Trips = new List<Trip>{Trips[2], Trips[3]} 
      }, 
      new Person() 
      { 
       ID = "003", 
       Name = "Elaine", 
       Description = "It has roots in a piece of classical Latin literature from 45 BC, making Lorems over 2000 years old." 
      } 
     }); 
    } 
} 

Person.cs

public class Person 
{ 
    [Key] 
    public String ID { get; set; } 
    [Required] 
    public String Name { get; set; } 
    public String Description { get; set; } 
    public List<Trip> Trips { get; set; } 
} 

Trip.cs

public class Trip 
{ 
    [Key] 
    public String ID { get; set; } 
    [Required] 
    public String Name { get; set; } 
} 

나는이 문제가 중 하나로, OData 라우팅과 관련이있다 "생각"하지만 난 아무 단서 이유 등이 없다 기본 동작이 제대로 작동하지 않습니다 ...

도움이 되었습니까? http://localhost:port/odata/People은 ('3') 경우

답변

1

당신은 Person 클래스의 키 속성의 string 유형이 있기 때문에 경로에있는 ID에 대한 작은 따옴표를 사용해야합니다 Andriy가 제안한 것처럼 get의 서명을 변경해야 할 수도 있습니다.

그래서 변경 : 공공 SingleResult 받기 ([FromODataUri] 문자열 키)

그리고 난 당신과 하나로, OData 서비스를 호출 할 수 있다고 생각 : 공공 SingleResult이

으로 ([FromODataUri] INT 키)를 가져옵니다 안드리가 제안했다.

1

당신이 문자열 값을 전달합니다 마르코스