8.7K Star 14.3K Fork 4.2K

GVPdotNET China/Furion

 / 详情

动作方法自定义路由如果不是以 / 开头,能否默认合并控制器路由

已完成
创建于  
2023-02-03 01:56

输入图片说明

💢 特别说明:如果 Issue 没有严格按照模板编写且未提供测试源码下载或 Git 测试仓库地址,则视为无效 Issue,将无法得到答复。

Furion 版本号

哪个版本号?


.NET SDK 版本号

  • .NET5
  • .NET6
  • .NET7

项目类型

  • WebApi
  • Mvc
  • Razor Pages
  • Blazor Server
  • MinApp
  • WinForm
  • WPF
  • Console

操作系统和版本

  • Windows(版本号?)
  • Linux(版本号?)
  • MacOS(版本号?)
  • 其他(版本号?)

代码环境

  • 开发环境(Development)
  • 生产环境(Production)
  • 测试环境(Tests/单元测试/集成测试 )

描述你的问题

发生了什么?

动作方法自定义路由如果不是以 / 开头,在不贴路由特性[Route("api/[controller]")]等时,能否默认合并控制器路由?

异常堆栈信息

异常堆栈是什么?


测试项目代码

⚠⚠ 必须提供完整可运行且包含错误的 Git 仓库 DEMO,DEMO 提供最简单的错误逻辑代码,否则将无法得到答复。⚠⚠

您的代码下载地址?


数据库信息和版本

请提供安装的 Nuget 包版本号。

  • Sqlite(包名和版本号?)
  • SqlServer(包名和版本号?)
  • MySQL(包名和版本号?)
  • Oracle(包名和版本号?)
  • PostgreSQL(包名和版本号?)
  • Firebird(包名和版本号?)
  • Cosmos(包名和版本号?)
  • InMemoryDatabase(包名和版本号?)

期待结果

期待的结果是?

动作方法自定义路由如果不是以 / 开头,能否默认合并控制器路由,不想贴路由特性[Route("api/[controller]")],如下图所示:
输入图片说明

输入图片说明

确认工单

为了减少不必要的沟通成本和时间成本,请再次确认 Issue 已按照要求正确填写,否则将被直接关闭。

评论 (17)

zuohuaijun 创建了任务 2年前
  1. [HttpMethod] 一旦提供了 Template,那么就是自定义路由了,这和原生是一致的。
  2. 本身就推荐使用 [ApiDescriptionSettings(Name ="")] 方式指定控制器或者动作的名称
  3. 或者使用 [Route("list"), HttpGet] 的方式也行
  4. 下次麻烦提供代码或者 demo,而不是截图片段让我抄代码,猜测代码,配置环境一堆没必要的时间浪费

你的需求我测试看看,实现之后会不会导致和原生存在分歧或影响到历史项目升级。

已实现,同时让这个动态API路由变得更强大,更变态了,比以往多了7种组合形式: https://gitee.com/dotnetchina/Furion/commit/679ff385bdac4088bed5a0466fa4a3c91996a132

下个版本发布。

测试代码

using Furion.DynamicApiController;
using Microsoft.AspNetCore.Mvc;

namespace WebApplication38;

[Route("api/[controller]")]
[Route("api2/[controller]")]
public class Test1Service : IDynamicApiController
{
    [HttpGet("test")]
    [HttpPost]
    [AcceptVerbs("PUT", "PATCH")]
    public async Task GetTestName()
    {
        await Task.CompletedTask;
    }
}

public class Test2Service : IDynamicApiController
{
    [HttpGet("/root/test")]
    [HttpGet("test")]
    [HttpGet(Name = "other-test")]
    [HttpGet("template-test", Name = "other-test")]
    [HttpPost]
    [AcceptVerbs("PUT", "PATCH")]
    public async Task GetTestName()
    {
        await Task.CompletedTask;
    }
}

[Route("api/[controller]")]
[Route("api2/[controller]/second")]
[Route("api3/[controller]/three")]
public class Test3Service : IDynamicApiController
{
    [HttpGet]
    [HttpGet("get/[action]")]
    [HttpPost]
    [HttpPost("post/cus-version")]
    public string GetVersion()
    {
        return "1.0.0";
    }
}

测试效果

输入图片说明

第二种模式是我要需要的

百小僧 任务状态待办的 修改为已完成 2年前

1、本以为只是个路由定义与合并的小问题,故没有提供demo 下次注意
2、在控制器没有贴[Route("api/[controller]")]时,[HttpMethod]和[Route]不会合并成完整路由(带路由前缀的)即使自定义路由不是以/开头
3、[ApiDescriptionSettings(Name ="")]这种是可行的 感谢

嗯嗯。我已经实现了你的需求,仔细分析是合理的,所以顺便重构了两年前的笨代码,现在支持多对多路由组合,嵌套组合,我等下发版,升级就行了。

Furion v4.8.5.7 版本已发布,已支持该需求。

百小僧 添加了
 
精华
标签
2年前

这个需求跟我上次那个差不多,当时好像每太表达清楚

我出了个大问题哎,没有发现怎么解决
基类中定义了路由

继承了基类

结果时路由重复生成

有问题,发 issue,提供 demo 复现。

这是接口套接口 route接route啊

不过这个经过测试确实是一个 Bug,马上修正,仔细观察你的代码实际上用法和设计很合理,所以必须支持您这么变态的玩法!!!

这个目的就是为了复用接口,不想每次都写,另外生成器生成的底层代码就会少很多。

Furion v4.8.6.8 版本已发布,已支持

本来动态 WebAPI 是让大家不用手动配置路由的,只需要通过配置调整即可。这倒好了,几乎全网都手动配置了,那还不如直接用控制器了。

我的工程里面写死路由名称是为了迎合应用层自定义接口风格,有人喜欢resful有人不喜欢,有人喜欢带动作前缀 有人不喜欢带等。底层接口固化死名称,就不随着外部应用设置而改变了。

@Lvgs @zuohuaijun 功能已支持,越来越变态了。。。

测试代码

using Furion.DynamicApiController;
using Microsoft.AspNetCore.Mvc;

Serve.Run();

public class WithClass : IDynamicApiController
{
    [Route("Add")]
    public void Add()
    {

    }

    [Route("Edit")]
    public void Edit()
    {

    }
}

[Route("api/system/SystemDictionary")]
public class SystemService : WithClass
{
    public void Some()
    {
    }
}

测试结果

输入图片说明

代码修正

https://gitee.com/dotnetchina/Furion/commit/f7faa6a211881efe0319025f4791b4b1b8c0669b

发版

先吃饭,等下发版~~

哈哈,我是方便基类用的,这样我的每个控制器或service代码就会少的可怜。

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(4)
974299 monksoul 1578937227 61753 zuohuaijun 1686997111 7827890 liuarchitects 1623001545 孤夜一点星-Lvgs
C#
1
https://gitee.com/dotnetchina/Furion.git
git@gitee.com:dotnetchina/Furion.git
dotnetchina
Furion
Furion

搜索帮助