我目前在ASP .NET MVC 5项目中有两个区域.一个叫做支持者,一个叫做查特.在这两个区域中的每一个区域中都有一个ApiController名称CommunicationController,由于ApiController路由的工作性质,这会产生问题.
如果我只在一个区域中ApiController命名CommunicationController了一个,它的路由将不包括URL中的区域,并且URL将是这样的:
http://example.com/api/communication/someAction
但在上面的URL中,该区域在哪里?
由于我的两个控制器命名相同,它们现在都有路由问题.
我尝试按照这里的说明操作:http://blogs.infosupport.com/asp-net-mvc-4-rc-getting-webapi-and-areas-to-play-nicely/
它们似乎适用于ASP .NET MVC 4 RC,由于我使用的是MVC 5,因此它不再具有相关性,这可能就是它无法正常工作的原因.
但是,从该博文中回顾一下,这是我的路由文件.
App_Start\RouteConfig.cs
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Default", "{controller}/{action}",
new {action = "Index", controller = "Home"},
new[] { "Website.Controllers" }
);
}
}
Run Code Online (Sandbox Code Playgroud)
App_Start\WebApiConfig.cs
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
//the two lines below were added.
config.Routes.MapHttpRoute("SupportersApi", "api/supporters/{controller}/{id}", new {id = RouteParameter.Optional, area = "Supporters"}
);
config.Routes.MapHttpRoute("ChatterApi", "api/chatter/{controller}/{id}", new { id = RouteParameter.Optional, area = "Chatter" }
);
}
}
Run Code Online (Sandbox Code Playgroud)
区\颤振\ ChatterAreaRegistration.cs
public class ChatterAreaRegistration : AreaRegistration
{
public override string AreaName
{
get { return "Chatter"; }
}
public override void RegisterArea(AreaRegistrationContext context)
{
//the below line was added.
context.Routes.MapHttpRoute("Chatter_api", "api/chatter/{controller}/{id}", new { id = RouteParameter.Optional, area = "Chatter" }
);
context.MapRoute(
"Chatter_default",
"Chatter/{controller}/{action}/{id}",
new {action = "Index", id = UrlParameter.Optional}
);
}
}
Run Code Online (Sandbox Code Playgroud)
区\支持者\ SupportersAreaRegistration.cs
public class SupportersAreaRegistration : AreaRegistration
{
public override string AreaName
{
get
{
return "Supporters";
}
}
public override void RegisterArea(AreaRegistrationContext context)
{
//the below line was added.
context.Routes.MapHttpRoute("Supporters_api", "api/supporters/{controller}/{id}", new { id = RouteParameter.Optional, area = "Supporters" }
);
context.MapRoute(
"Supporters_default",
"Supporters/{controller}/{action}/{id}",
new { action = "Index", controller = "Home", id = UrlParameter.Optional }
);
}
}
Run Code Online (Sandbox Code Playgroud)
我在这里做错了什么,我有什么选择?
使用WebAPI 2属性,因为您正在使用MVC 5,并且您可以通过声明API的路由及其实现来删除大量样板代码(您还可以为HTTP操作指定谓词,甚至使用属性自动转换为XML/JSON /本月序列化).
除非您出于其他原因使用区域,否则您实际上不需要它们来实现Web API.
特别是,你想要的是RoutePrefix属性.
| 归档时间: |
|
| 查看次数: |
6751 次 |
| 最近记录: |