【问题标题】:ASP Core: how to route to API Controller that is located in the area folder?ASP Core:如何路由到位于区域文件夹中的 API 控制器?
【发布时间】:2019-06-19 21:11:38
【问题描述】:

结构:

+ MyProj
   + Areas
       + Configuration
          - Pages
          - ConfigurationApiController.cs

VS2017 提出了创建没有 Controllers 文件夹的控制器,这对我来说没问题,因为我使用 Razor Pages 并且不需要 Controllers 文件夹:

那些不起作用:

控制器定义:

[Route("api")]
[Produces("application/json")]
[ApiController]
public class ConfigurationApiController : ControllerBase
{
    private readonly ApplicationSettings applicationSettings;
    [HttpGet]
    public ActionResult GetUsers()
    {

mvc路由配置标准方式:

app.UseMvc(routes =>
            {

                routes.MapRoute(
                    name: "default",
                    template: "{controller=Home}/{action=Index}/{id?}");
            });

如何路由到GetUsersConfigurationApiController的动作?

【问题讨论】:

    标签: asp.net-core asp.net-core-webapi razor-pages asp.net-core-2.2


    【解决方案1】:

    修改api路由,添加Area Attribute为[area]路由提供区域名称。

        [Area("Configuration")]
        [Route("[area]/api/[controller]")]
        [ApiController]
        public class ConfigurationApiController : ControllerBase
        {
        }
    

    就是这样,可以通过http://localhost:8080/Configuration/api/ConfigurationApi访问它

    【讨论】:

    • “为区域添加 MapRoute”是什么概念? localhost:8080/Configuration/api/ConfigurationApi 没有它,只有在添加 area 属性后才能工作。
    • @RomanPokrovskij 如果您没有为区域定义 MapRoute,那么您仍在使用默认的 MapRoute {controller=Home}/{action=Index}/{id?}。在您的情况下, controller = Configuration, action = api, id = ConfigurationApi 。如果你的控制器中有 Get(int id) 方法,检查 id 值,你会发现 id 值为 "ConfigurationApi"
    • 我想念routes.MapRoute(name: "areas",... 会有什么缺点? Api Controller没有它也能工作(因为RouteAttribute?)当剃刀页面我感觉有自己的区域配置方法:stackoverflow.com/questions/54379637/…
    • 是的,我认为你是对的,如果我们已经在 RouteAttribute 中定义了区域,就不需要 MapRoute。我会更新答案。谢谢
    【解决方案2】:

    其他一些路由选项:

    1. 使用 AspNetCore.RouteAnalyzer 找到工作选项:http://localhost:8080/api(是,无需操作)

    2. 删除 Web API 属性后

       // [Route("api")]
       // [Produces("application/json")]
       // [ApiController]
    

    然后http://localhost:8080/ConfigurationApi/GetUsers

    可能没问题,但路由中没有区域,似乎“按约定路由到该区域”不起作用是 asp 核心: ASP Core: how to configure area for api controller without AreaAttribute (or how to enable convention area routing for Api controller)?https://github.com/aspnet/AspNetCore/issues/7042

    同样在这种情况下ContentResult { Content = json, ContentType = "application/json" } 应该返回,但这对我来说没问题,因为我更喜欢使用就地序列化而不是流序列化器。

    1. 这个路由到http://localhost:8080/Configuration/api
        [Area("Configuration")]
        [Route("[area]/api")] 
        [Produces("application/json")]
        [ApiController]
    

    其他选项:[Route("[area]/api/[action]")] 路由到http://localhost:8080/Configuration/api/GetUsers

    删除区域属性时会抛出运行时错误Error: While processing template '[area]/api', a replacement value for the token 'area' could not be found. Available tokens: 'action, controller'. To use a '[' or ']' as a literal string in a route or within a constraint, use '[[' or ']]' instead.

        //[Area("Configuration")]
        [Route("[area]/api")]
        [Produces("application/json")]
        [ApiController]
    

    要支持@Url.Action(action: "myArea", controller: "myControllerApi") 路由应该手动配置。

    Asp 核心路由:

     app.UseMvc(routes =>
            {
            routes.MapRoute(
            name: "defaultArea",
            template: "{area:exists}/{controller}/{action}"); // matches only those where area route value is defined
            });
    

    Asp Core 3 路由(启动配置):

     app.UseEndpoints(endpoints =>
            {
                endpoints.MapRazorPages();
                endpoints.MapControllerRoute(
                    name: "defaultArea",
                    pattern: "{area:exists}/{controller}/{action}");
            });
    

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多