2016-09-07 1 views
0

Я в процессе преобразования веб-службы для использования OData. Я создал реализацию ODataController, как показано ниже:OData 4 AspNet: GET по параметру не работает

public class PersonController : ODataController 
{ 

    public PersonController() 
    { 

    } 

    public IHttpActionResult Get() 
    { 
     return Ok(new Person()); 
    } 

    public IHttpActionResult Get([FromODataUri] int key) 
    { 
     return Ok(new Person()); 
    } 

    protected override void Dispose(bool disposing) 
    { 
    } 
} 

И зарегистрировал модель, как так:

var builder = new ODataConventionModelBuilder(); 
builder.EntitySet<Person>("Person"); 

config.MapHttpAttributeRoutes(); 

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

config.MapODataServiceRoute(
routeName: "odata", 
routePrefix: "odata", 
model: builder.GetEdmModel()); 

Веб-приложение развертывается без проблем, а первая функция работает, когда я звоню:

http://localhost:9200/odata/Customer 
-> 
{ 
    "@odata.context":"http://localhost:9200/odata/$metadata#Person/$entity","Name":"John" 
} 

Однако при вызове http://localhost:9200/odata/Customer(1) трассировка в журнале сервера показывает, что маршрут не найден:

iisexpress.exe Information: 0 : Response, Status=404 (NotFound), Method=GET, Url=http://localhost:9200/odata/Person(1), Message='Content-type='application/xml; charset=utf-8', content-length=unknown' 

Я пробовал различные перестановки атрибутов с помощью ODataRoutePrefix, ODataRoute, EnableQuery по методу, и до сих пор ничего я не кажется, что помогает. Учебники, которые я видел, говорят, что это должно сработать, так что теперь я застрял в недоумении, как я должен работать. У кого-нибудь есть идеи?

ответ

0

Мне удалось решить мою собственную проблему.

Проблема была в том, что ключ, определенный внутри объекта, имел тип String. Это означает, что ключ, извлеченный FromODataUri, также должен иметь тип String!

В этом примере проблему можно устранить, изменив ключ на тип String или изменив ключ Person на тип int.