asp.net Web API和odata的路由

use*_*189 6 asp.net asp.net-mvc odata asp.net-mvc-4 asp.net-web-api

我的asp.net网络应用程序是混合的,可以具有所有不同类型的控制器-

  1. asp.net MVC控制器(来自System.Web.Mvc.Controller
  2. asp.ner Web API控制器(源自System.Web.Http.ApiController)和
  3. 基于asp.net的OData控制器(源自System.Web.Http.OData.ODataController

我正在尝试WebApiConfig.cs为Web API和OData控制器配置路由,它看起来像这样-

public static void Register(HttpConfiguration config)
{
    config.Routes.MapODataRoute("OData", "odata", CreateEdmModel());

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

public static IEdmModel CreateEdmModel()
{
    ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder();
    modelBuilder.EntitySet<Detail>("Details");
            return modelBuilder.GetEdmModel();
}
Run Code Online (Sandbox Code Playgroud)

可行的路线-

  1. API /值/ GetSummary(对于ASP.Net Web API基于ValuesControllerGetSummaryaciton方法)
  2. 主页(对于常规的asp.net MVC HomeController

无效的路线-

  1. odata /摘要
  2. odata /摘要/ GetSummary

我的常规MVC控制器可以正常运行,Web API控制器也可以正常运行,但是对于OData控制器来说,路由不起作用。有没有人尝试过在单个应用程序中进行混搭并使其工作?我还将需要在路由中指定操作方法名称,因为所有操作方法都主要是GET因为它是一个报告应用程序。

小智 4

是的,可以混合使用所有这些控制器。如果 MVC 的路由首先在 Global.asax.cs 中激活,则 MVC 的默认路由可能不允许到达 OData 控制器。如下所示更改 Global.asax.cs 中的行顺序将解决该问题。如果使用项目模板,MVC 控制器路由通常在 RouteConfig.cs 中设置,Web API 和 OData 路由在 WebAPIConfig.cs 中设置。

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

        GlobalConfiguration.Configure(WebApiConfig.Register); // moved up before MVC's setup
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        BundleConfig.RegisterBundles(BundleTable.Bundles);

    }
Run Code Online (Sandbox Code Playgroud)