繁体   English   中英

退货任务 <T> 作为普通的任务破坏了WebAPI

[英]Return Task<T> as plain Task breaks WebAPI

这实际上是这个问题上的另一个天使

结果类型未知的任务

考虑这段代码

public interface IQueryHandler<in TQuery, TResult> where TQuery : Query<TResult>
{
    Task<TResult> Handle(TQuery query);
}

上面的接口被调用,就像Task<T>将作为Task公开

public Task Invoke(Query query)
{
    var queryHandlerType = typeof(IQueryHandler<,>);
    var queryType = query.GetType();
    var queryResultType = queryType.BaseType.GetGenericArguments().First();
    var handler = _container.GetInstance(queryHandlerType.MakeGenericType(queryType, queryResultType)) as dynamic;
    return handler.Handle(query as dynamic);
}

WebApi控制器

public Task Get([FromUri] Contract contract)
{
    return _invoker.Invoke(CreateDto<Query>(contract));
}

这将破坏WebAPI,并且由于某种原因响应会将我重定向到网站的基本URL

您得到的是重定向响应而不是204,这似乎很奇怪,但是无论哪种方式,您的操作方法都不会像预期的那样具有该方法签名的行为。 通过返回Task ,可以有效地告诉您要(异步)不返回任何内容的框架。

我知道你不知道TTask<T>在运行时这里和方法来解决那就是等待结果,并将其转换为一个对象。 这应该工作:

public async Task<object> Get([FromUri] Contract contract)
{
    var result = await _invoker.Invoke(CreateDto<Query>(contract));
    return result as object;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM