【问题标题】:Odata returning 404 error with jquery getOdata使用jquery get返回404错误
【发布时间】:2014-04-26 01:53:50
【问题描述】:

我正在尝试配置一些 odata 导航,但看不到问题所在。

配置:

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>

当使用提琴手 localhost:port/odata 返回 404 时,localhost:port/odata/Catalog 也是如此

我一定是在这里遗漏了一些基础知识。Unit of work with 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>

但是当我在 odata 之后添加 Catalog 时,它会抛出 404 not found。仍然迷失,但正在取得进展。

【问题讨论】:

  • 您将路由配置为:apicontrollers/... 而不是odata/...
  • 我以为那个部分是告诉路由你的api在哪个部分,如果你有同名的api控制器和MVC控制器会发生什么?哦,源代码已经按照我的方式设置了,路由指向他的 api 文件夹。
  • 不,它是WebAPI每条路由前的前缀,你可以把它改成odata就可以了。
  • 尝试使用 api/...odata/... 仍然收到 404 错误。路由怎么知道我的api控制器在ApiControllers/CatalogController.cs的路径中
  • 冲突发生在应用程序启动中,在剥离除 webapi 之外的所有内容后,它可以工作。必须将控制器的扩展名更改为OdataController

标签: jquery asp.net-web-api odata


【解决方案1】:

EntitySetController 和 AsyncEntitySetController 在新的 WebAPI 版本中被删除。您始终可以使用“public class {EntitySetName}Controller : ODataController 作为您的控制器。

顺便说一句,您可以参考以下博客了解 WebApi 2.2 与 OData V4 的新用法:

Getting started with ASP.NET Web API 2.2 for OData v4.0

【讨论】:

    【解决方案2】:

    我需要交换注册顺序

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

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2014-12-09
      • 1970-01-01
      • 2021-03-31
      • 1970-01-01
      • 2011-08-27
      • 2016-06-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多