OData rutas de retorno 404 No Encontrado

He empezado incluyendo OData en mi WebAPi2 proyecto (actualmente alojado en IIS8 Express en mi dev máquina). Mi OData config clase se parece a esto:

public class ODataConfig
{
    private readonly ODataConventionModelBuilder modelBuilder;

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

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

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

Luego he añadido el siguiente en mi WebApiConfig clase:

ODataConfig odataConfig = new ODataConfig();

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

Y comenzó con un controlador básico y sólo una acción, como este:

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

        return Ok(entity);
    }
}

Entonces, en mi HttpClient, la url de la petición se parece a esto:
MyServer/OData/Categoría(10)

Sin embargo, me da el siguiente error:

{"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'."}

Lo que me estoy perdiendo aquí?

EDITAR

Si puedo configurar el routePrefix a null o ‘odata’ y cambiar mi url de la petición en consecuencia, la solicitud funciona bien. Así que esto significa que no puedo tener un prefijo de ruta como «myServer/odata’.

Es este OData convención de nomenclatura estándar? Y si sí, puede ser reemplazado?

2 Kommentare

  1. 1

    He estado usando el mismo WebApiConfig.Register() método que se incluye por defecto en la Web de la API de proyecto y que pasa con la siguiente:

    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());

    El primer parámetro es un nombre descriptivo, el segundo es el que buscas! Usted puede cambiar esto a lo que usted desea.

    ACTUALIZACIÓN: Si usted está usando OData V4, el enrutamiento es inicializado como este:

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

    Si usted está usando la V4, basadas en el método de enrutamiento a través de la utilización de los atributos de ahora está disponible (creo que Nancy estilo)

    Usted puede utilizar esto en un OWIN inicio de la clase o el Mundial.asax. De cualquier manera funciona muy bien para mí.

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

  2. 2

    Este es probablemente demasiado tarde, pero para cualquier otra persona que termina aquí…

    No creo que el problema es de odata. Tal vez usted está funcionando mal de la ruta predeterminada como el mensaje «No hay un tipo se encontró que coincide con el controlador llamado ‘OData'», sugiere que http://localhost/MyServer/OData/Category(10)
    se enrutan mediante

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

    así que está buscando un controlador llamado ODataController con una acción de «Categoría». Debe definir «localhost/Miservidor» como la raíz de la que el enrutamiento se aplica. Lamentablemente yo no puedo sugerir cómo podría hacer eso, pero esperemos que esto apunta en la dirección correcta.

    • me pasé una hora tratando de averiguar lo que hice mal. gracias!
    • Yo sólo quería añadir a esto…. Esto puede ser solucionado por el movimiento de los config.MapODataServiceRoute{...} aplicación por encima de la routes.Maproute{...} O config.MappHttpRoute{...} la aplicación en su WebApiConfig

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea