pda-team/Panda.DynamicWebApi

基于.net core3.1并且升级到最新版本,异步方法无法调用

Closed this issue · 15 comments

平台版本是.net core3.1,DynamicWebApi升级到了1.0.3
在测试时候发现异步方法动态api失效了,请求会全部返回415状态,经过测试复现的情况如下:
1、前提条件是使用的异步方法,返回值是 async Task或者直接Task
2、第二个条件是必须有对象类型的参数
以自带的demo为例,:

public IEnumerable<string> GetAllAsync(UpdateAppleDto dto);
public IEnumerable<string> GetAllAsync(int id);
public async Task<IEnumerable<string>> GetAllAsync(int id);

这几种写法都是正常的,但如果使用下面的写法,则均不可用

public async Task<IEnumerable<string>> GetAllAsync(UpdateAppleDto dto);

请问你是否是构建请求的数据不正确,415乃是 MediaType(ContentType) 不正确,API已经正确动态生成,基本上不可能是出这种怪异的错误的。我这里测试了async api是正确的,相关代码已经push。

image

image

我尝试了一下这样操作:
将方法的[HttpPost]或者[HttpGet]的特性删除,同时保证去除Get、Update前缀,Async后缀后方法名称是唯一的。比如 GetAllAppleByNameAsync,默认配置下生成的API应该为AllAppleByName吧?但是,只要删除特性,就会出错,首先出错的是swagger,同时方法也是不能请求的。当然,跟特性中方法的别名没有关系。是不是对于前缀的识别有问题了?
使用的代码:

       [AllowAnonymous]
        //[HttpGet("GetAllAppleByNameAsync")]
        //[HttpGet]
       public async Task<IEnumerable<string>> GetAllAppleByNameAsync(UpdateAppleDto dto)
        {
            return await Task.Run(()=> {
                return Apples.Values;
            });
           
        }

swagger出错
image

这个组件使用是需要遵循一定规则的,麻烦仔细看使用文档

这个问题是在升级后才出现的,是升级后有规则变了? 再有就是实在是没有看出来上面定义的方法哪里不符合规则。手册的(7)写明的,默认是根据方法名的前缀决定HTTP动词,再去除Async后缀,实在是不知道哪里用的有问题?因为在上面的测试中是必须加[HttpGet]特性才是正常的,那么方法的前缀名称Get实际是无效的吗?

这部分逻辑没有任何改变

我写了特性,是因为有了同步方法 UpdateApple,如果说 UpdateAppleAsync 移除了 Async就会造成同名,理解了吗

不是说你这样做就不对,你也要看下其他方法是否 会造成冲突啊。我真的是,不晓得啷个给你解释了,直接上完整代码Ok?
image

完整代码,已删除其他所有,只保留一个,同时注释HttpPost特性,请运行

public class AppleAppService: IDynamicWebApi
    {
        private static readonly Dictionary<int,string> Apples=new Dictionary<int, string>()
        {
            [1]="Big Apple",
            [2]="Small Apple"
        };
        [AllowAnonymous]
        //[HttpPost("UpdateAppleAsync")]
        public async Task UpdateAppleAsync(UpdateAppleDto dto)
        {
            await Task.Run(()=> {
                if (Apples.ContainsKey(dto.Id))
                {
                    Apples[dto.Id] = dto.Name;
                }
            });
         
        }
    }

已修复

呵呵,怼别人前先自己确认自己是对的

是,我有错,但是你觉得你就完全没问题?我都不打算继续扯了,你既然要说,那就来

先说415的问题,是不是你自身的问题

然后你最开始说的是不支持异步方法,而我按照你的说明以及我这边测试确实无问题,因为你并没有提供你的完整测试代码,造成了你我不同的差异,得到不同的结论,这个你觉得不是个问题?

不想扯了,我们都有问题,修复就行

不想扯了,我们都有问题,修复就行

谢谢提出问题,我们会一直改进。

下次提问请把报错和各种描述都尽可能一次性说清楚,以免产生不必要的误会和不愉快。

谢谢支持。