从OData控制器

时间:2015-12-02 17:14:35

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api odata asp.net-mvc-routing

我正在寻找一种在ASP.NET MVC4 Web上使用OData控制器的方法.API

使用

在应用程序启动中注册路由
using Microsoft.Data.Edm;
using System.Web.Http;
using System.Web.Http.OData.Builder;
public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapODataRoute("odata", "api", GetEdmModel());
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
                );
            config.Formatters.Remove(config.Formatters.XmlFormatter);
        }

        static IEdmModel GetEdmModel()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
            return builder.GetEdmModel();

        }
 }}

OData控制器:

using System.Web.Http;
using System.Web.Http.OData;
using System.Web.Http.OData.Query;
using System.Collections;

public class ODController : ODataController
{

    public class Poco
    {
        public int id { get; set; }
        public string name { get; set; }
        public string type { get; set; }
    }

    public IEnumerable Get(ODataQueryOptions queryOptions)
    {
        return new Poco[] {
    new Poco() { id = 1, name = "one", type = "a" },
    new Poco() { id = 2, name = "two", type = "b" },
    new Poco() { id = 3, name = "three", type = "c" }
};
    }

访问网址http://localhost:52216/admin/API/OD会返回406不接受错误。 调试器显示控制器被命中。从控制器返回后发生错误。 Hwo要解决这个问题,以便OData控制器可以在MVC4中的Web API中使用吗?

1 个答案:

答案 0 :(得分:1)

我认为你将webapi和webapi混合用于odata。最好先阅读samples and tutorials

根据您的提及,我无法理解为什么您希望OData能够根据一个空的Edm模型序列化一个飞行POCO列表。

请试试这个:

使用您的POCO类来构建模型

ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Poco>("Do");
return builder.GetEdmModel();

确保控制器类命名约定。它应该是[EntitySetName] + "Controller"

删除Web API路由。

<德尔> config.Routes.MapHttpRoute(..);

然后,请求Uri应该返回你想要的。感谢。