Odata возвращает ошибку 404 с помощью jquery get

0

Я пытаюсь настроить некоторую навигацию odata и не вижу, что проблема здесь.

Config:

public class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
            var entitySetConfiguration = modelBuilder.EntitySet<Catalog>("Catalog");
            entitySetConfiguration.EntityType.Ignore(t => t.OutboundCatalogItems);
            entitySetConfiguration.EntityType.Ignore(t => t.OutboundColumns);
            entitySetConfiguration.EntityType.Ignore(t => t.OutboundProcessor);
            entitySetConfiguration.EntityType.Ignore(t => t.OutboundProcessorID);
            entitySetConfiguration.EntityType.Ignore(t => t.RelationshipId);
            entitySetConfiguration.EntityType.Ignore(t => t.CatalogConfigurationProperties);
            var model = modelBuilder.GetEdmModel();
            config.Routes.MapODataRoute("ODataRoute", "odata", model);

            config.EnableQuerySupport();

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

Постановка на учет

public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }

        protected void Application_EndRequest(object sender, EventArgs e)
        {
            Helpers.DataAccess.DisposePDBUnitOfWork();
        }
    }

контроллер

public class CatalogController : EntitySetController<Catalog, int>
    {
        private readonly PDBCoreUnitOfWork _unitOfWork;

        public CatalogController()
        {
            _unitOfWork = new PDBCoreUnitOfWork(0);
        }

        public override IQueryable<Catalog> Get()
        {
            return _unitOfWork.Repository<Catalog>().Query().Get();
        }

        protected override void Dispose(bool disposing)
        {
            _unitOfWork.Dispose();
            base.Dispose(disposing);
        }
    }

скрипт

<script type="text/javascript">

        var catalogApi = "/odata/Catalog";
        $.getJSON(catalogApi)
            .done(function(json) {
                console.log("Json data: " + json);
            })
            .fail(function(jqxhr, textStatus, error) {
                var err = textStatus + ", " + error;
                console.log("Request Failed: " + err);
           });

</script>

При использовании fiddler localhost: port/odata возвращает 404, так что localhost: port/odata/Catalog

Мне, должно быть, не хватает части фунтамента. Единица работы с oData


ОБНОВЛЕНИЕ Когда я прокомментирую следующее:

protected void Application_Start()
        {
            //AreaRegistration.RegisterAllAreas();
            //RouteConfig.RegisterRoutes(RouteTable.Routes);
            GlobalConfiguration.Configure(WebApiConfig.Register);
            //GlobalConfiguration.Configure(ODataConfig.Register);
        }

А также

public class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
            //var entitySetConfiguration = modelBuilder.EntitySet<Catalog>("Catalog");
            //entitySetConfiguration.EntityType.Ignore(t => t.OutboundCatalogItems);
            //entitySetConfiguration.EntityType.Ignore(t => t.OutboundColumns);
            //entitySetConfiguration.EntityType.Ignore(t => t.OutboundProcessor);
            //entitySetConfiguration.EntityType.Ignore(t => t.OutboundProcessorID);
            //entitySetConfiguration.EntityType.Ignore(t => t.RelationshipId);
            //entitySetConfiguration.EntityType.Ignore(t => t.CatalogConfigurationProperties);
            var model = modelBuilder.GetEdmModel();

            //config.MapHttpAttributeRoutes();
            config.Routes.MapODataRoute("odata", "odata", model);

            config.EnableQuerySupport();

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

Тип ввода localhost/port/odata:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="http://localhost:45837/odata">
<workspace>
<atom:title type="text">Default</atom:title>
</workspace>
</service>

Но когда я добавляю Catalog после odata, он выталкивает 404 не найден. Все еще потеряно, но прогресс.

  • 0
    вы настроили маршрут к: apicontrollers/... не odata/...
  • 0
    Я думал, что этот раздел должен сообщить маршрутизации, в каком разделе находится ваш API, что произойдет, если у вас есть контроллер API и контроллер MVC с одинаковым именем? Да, и исходный код настроен так, как я, с маршрутизацией, указывающей на его папку API.
Показать ещё 4 комментария
Теги:
asp.net-web-api
odata

2 ответа

1
Лучший ответ

Мне нужно было поменять порядок регистрации

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            GlobalConfiguration.Configure(ODataConfig.Register);
        }

И изменил это

public class CatalogController : EntitySetController<Catalog, int>
    {
       ....
    }

К этому

public class CatalogController : OdataController
    {
       ....
    }
1

EntitySetController и AsyncEntitySetController удаляются в новой версии WebAPI. Вы всегда можете использовать " public class {EntitySetName}Controller: ODataController как ваш контроллер.

Кстати, вы можете сослаться на следующий блог для нового использования WebApi 2.2 с OData V4:

Начало работы с ASP.NET Web API 2.2 для OData v4.0

Ещё вопросы

Сообщество Overcoder
Наверх
Меню