asp.net-mvc – OData和WebAPI路由冲突
发布时间:2020-12-16 07:41:50 所属栏目:asp.Net 来源:网络整理
导读:我有一个带有WebAPI控制器的项目.我现在正在添加OData控制器.问题是我的OData控制器与现有的WebAPI控制器具有相同的名称,这导致异常: Multiple types were found that match the controller named 'Member'. This can happen if the route that services th
我有一个带有WebAPI控制器的项目.我现在正在添加OData控制器.问题是我的OData控制器与现有的WebAPI控制器具有相同的名称,这导致异常:
Multiple types were found that match the controller named 'Member'. This can happen if the route that services this request ('OData/{*odataPath}') found multiple controllers defined with the same name but differing namespaces,which is not supported. The request for 'Member' has found the following matching controllers: Foo.Bar.Web.Areas.API.Controllers.MemberController Foo.Bar.Web.Odata.Controllers.MemberController 即使控制器位于不同的名称空间并且应该具有可区分的路由,也会发生这种情况.以下是我所拥有的配置的摘要.我该怎么做(除了重命名控制器)以防止此异常?我正在尝试将这些端点公开为: mysite.com/OData/Members mysite.com/API/Members/EndPoint 在我看来,URL足够明显,必须有一些方法来配置路由,所以没有冲突. namespace Foo.Bar.Web.Odata.Controllers { public class MemberController : ODataController { [EnableQuery] public IHttpActionResult Get() { // ... do stuff with EF ... } } } namespace Foo.Bar.Web.Areas.API.Controllers { public class MemberController : ApiControllerBase { [HttpPost] public HttpResponseMessage EndPoint(SomeModel model) { // ... do stuff to check email ... } } } public class FooBarApp : HttpApplication { protected void Application_Start () { // ... snip ... GlobalConfiguration.Configure(ODataConfig.Register); AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); // ... snip ... } } public static class ODataConfig { public static void Register(HttpConfiguration config) { config.MapODataServiceRoute( routeName: "ODataRoute",routePrefix: "OData",model: GetModel()); } public static Microsoft.OData.Edm.IEdmModel GetModel() { // ... build edm models ... } } namespace Foo.Bar.Web.Areas.API { public class APIAreaRegistration : AreaRegistration { public override string AreaName { get { return "API"; } } public override void RegisterArea(AreaRegistrationContext context) { var route = context.Routes.MapHttpRoute( "API_default","API/{controller}/{action}/{id}",new { action = RouteParameter.Optional,id = RouteParameter.Optional } ); } } } 解决方法
您需要在WebAPI上包含名称空间约束:
var route = context.Routes.MapHttpRoute( name: "API_default",routeTemplate: "API/{controller}/{action}/{id}",defaults:new { action = RouteParameter.Optional,id = RouteParameter.Optional },); route.DataTokens["Namespaces"] = new string[] {"Foo.Bar.Web.Areas.API.Controllers"]; 如果您遇到视图控制器的冲突,您应该能够包含类似的命名空间约束: routes.MapRoute( name: "ViewControllers_Default",url: "{controller}/{action}/{id}",defaults: new { controller = "Home",action = "Index",id = UrlParameter.Optional,area = "" },namespaces: new[]{"Foo.Bar.Web.Controllers"} ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- WCF服务与ASP.NET Web Api
- asp.net-mvc – 实体框架4.1代码优先 – 在存储库之间共享d
- asp.net-mvc – 如何在编辑器模板中确定模型数组索引
- eShopOnWeb 知多少
- asp.net-mvc – 动作过滤器异常
- asp.net – 为什么IFormFile显示为null,我该如何解决?
- asp.net-mvc – 对Json解决方法的EntityFramework? (序列化
- 在asp.net MVC2中的每个Web请求上创建的nhibernate会话
- asp.net – 配置节“system.servicemodel”无法读取,因为它
- asp.net-mvc-4 – MVC 4如果经过身份验证,则从登录页面重定
推荐文章
站长推荐
- asp.net – 如何在Visual Studio 2008中安装(获取
- 如何从ASP.NET MVC网站中生成可下载的c#类?
- asp.net-mvc – 在链接文本中使用HTML元素创建一
- asp.net-web-api – 当我使用IFormFile时缺少一个
- asp.net-mvc-3 – 如何在NHibernate 3.2中实现通
- entity-framework-6 – Entity Framework种子方法
- asp.net-mvc – 是否可以复制/克隆Web请求的Http
- Getting Started with ASP.NET Core
- asp.net – .NET核心2.0 cookie身份验证 – 不重
- asp.net – 使用sql server的Web应用程序中的审计
热点阅读