基于.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);
我尝试了一下这样操作:
将方法的[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;
});
}
这个组件使用是需要遵循一定规则的,麻烦仔细看使用文档
这个问题是在升级后才出现的,是升级后有规则变了? 再有就是实在是没有看出来上面定义的方法哪里不符合规则。手册的(7)写明的,默认是根据方法名的前缀决定HTTP动词,再去除Async后缀,实在是不知道哪里用的有问题?因为在上面的测试中是必须加[HttpGet]特性才是正常的,那么方法的前缀名称Get实际是无效的吗?
这部分逻辑没有任何改变
我写了特性,是因为有了同步方法 UpdateApple,如果说 UpdateAppleAsync 移除了 Async就会造成同名,理解了吗
完整代码,已删除其他所有,只保留一个,同时注释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的问题,是不是你自身的问题
然后你最开始说的是不支持异步方法,而我按照你的说明以及我这边测试确实无问题,因为你并没有提供你的完整测试代码,造成了你我不同的差异,得到不同的结论,这个你觉得不是个问题?
不想扯了,我们都有问题,修复就行
不想扯了,我们都有问题,修复就行
谢谢提出问题,我们会一直改进。
下次提问请把报错和各种描述都尽可能一次性说清楚,以免产生不必要的误会和不愉快。
谢谢支持。