2014-11-11 30 views
7

Ho iniziato a includere OData nel mio progetto WebAPi2 (attualmente ospitato in IIS8 Express sul mio computer di sviluppo). La mia classe config OData si presenta così:Percorsi OData restituiti 404 non trovato

public class ODataConfig 
{ 
    private readonly ODataConventionModelBuilder modelBuilder; 

    public ODataConfig() 
    { 
     modelBuilder = new ODataConventionModelBuilder(); 

     modelBuilder.EntitySet<Category>("Category"); 
    } 

    public IEdmModel GetEdmModel() 
    { 
     return modelBuilder.GetEdmModel(); 
    } 
} 

poi ho aggiunto il seguente nella mia classe WebApiConfig:

ODataConfig odataConfig = new ODataConfig(); 

config.MapODataServiceRoute(
    routeName: "ODataRoute", 
    routePrefix: "MyServer/OData", 
    model: odataConfig.GetEdmModel(), 
    defaultHandler: sessionHandler 
); 

e ha iniziato con un controller di base e una sola azione, come questo:

public class CategoryController : ODataController 
{ 
    [HttpGet] 
    public IHttpActionResult Get([FromODataUri] int key) 
    { 
     var entity = categoryService.Get(key); 
     if (entity == null) 
      return NotFound(); 

     return Ok(entity); 
    } 
} 

Quindi, nel mio HttpClient, l'URL della richiesta è simile al seguente: MyServer/OData/Category (10)

Tuttavia, sto ottenendo il seguente errore:

{"Message":"No HTTP resource was found that matches the request URI 'http://localhost/MyServer/OData/Category(10)'.","MessageDetail":"No type was found that matches the controller named 'OData'."} 

Che cosa mi manca qui?

EDIT

Se ho impostato il routePrefix su null o 'odata' e cambiare la mia richiesta url di conseguenza, la richiesta funziona bene. Questo significa che non posso avere un prefisso del percorso come "myServer/odata".

Questa convenzione di denominazione standard OData? E se sì, può essere ignorato?

risposta

1

Sto usando la stessa WebApiConfig.Register() metodo che è incluso di default nel progetto Web API e passando utilizzando i seguenti:

var builder = new ODataConventionModelBuilder(); 

// OData entity sets.. 
builder.EntitySet<Seat>("Seats"); 
builder.EntitySet<Table>("Tables"); 

// Configure the Route 
config.Routes.MapODataServiceRoute("odata", "odata", builder.GetEdmModel()); 

Il primo parametro è un nome, il secondo è quello che si stai dopo! Puoi cambiarlo in qualunque cosa tu voglia.

UPDATE: Se stai usando OData V4, l'instradamento viene inizializzato in questo modo:

config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());

Se stai usando V4, il routing basato il metodo attraverso l'uso di attributi è ora disponibile (si pensi Stile Nancy)

È possibile utilizzare questo in una classe di avvio OWIN o Global.asax. In entrambi i casi funziona bene per me.

consultare: http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api/odata-v3/creating-an-odata-endpoint

1

Questo è probabilmente troppo tardi, ma per chiunque altro che finisce qui ...

Non credo che il problema è odata. Forse si sta eseguendo fallo del comportamento di default come il messaggio "Nessun tipo è stato trovato che corrisponde al controller di nome 'OData'" suggerisce che http://localhost/MyServer/OData/Category(10) viene instradata usando

routes.MapRoute(
    "Default", // Route name 
    "{controller}/{action}/{id}", // URL with parameters 

quindi è alla ricerca di un controller chiamato ODataController con un'azione "Categoria". È necessario definire "localhost/MyServer" come root da cui viene applicato il routing. Sfortunatamente non posso suggerire come potresti farlo, ma spero che questo ti guidi nella giusta direzione.

+0

ho passato un'ora a cercare di capire cosa ho fatto di sbagliato. Grazie! –

Problemi correlati