gpt4 book ai didi

c# - 让 ApiController 与区域一起工作?

转载 作者:太空狗 更新时间:2023-10-29 20:58:35 25 4
gpt4 key购买 nike

我目前在我的 ASP .NET MVC 5 项目中有 2 个区域。一种叫做支持者,一种叫做喋喋不休。在这两个区域中的每一个区域中,都有一个名为 CommunicationControllerApiController,由于 ApiController 的工作方式,这会带来一个问题路由。

问题示例

如果我在一个区域中只有一个名为 CommunicationControllerApiController,它的路由将不会在 URL 中包含该区域,并且 URL 将是这样的:

http://example.com/api/communication/someAction

但是在上面的URL中,区域在哪里呢?

由于我的两个 Controller 同名,它们现在都有路由问题。

我尝试了什么?

我尝试按照此处的说明进行操作: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" }
);
}
}

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" }
);
}
}

区域\Chatter\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}
);
}
}

Areas\Supporters\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 }
);
}
}

我在这里做错了什么,我有什么选择?

最佳答案

使用 WebAPI 2 attributes ,因为您使用的是 MVC 5,并且您可以通过声明 API 的路由及其实现来摆脱大量样板代码(您还可以为 HTTP 操作指定动词,甚至使用属性自动转换为XML/JSON/每月序列化)。

除非您出于其他原因使用区域,否则您实际上不需要它们来实现 Web API。

特别是,您需要的是 RoutePrefix 属性。

关于c# - 让 ApiController 与区域一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25332599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com