返回任务<t>为普通任务中断WebAPI </t>

时间:2015-04-21 10:14:49

标签: c# asp.net-web-api async-await

在这个问题上,这实际上是一个不同的天使

Task with result unknown type

考虑这段代码

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,并且由于某种原因,响应会将我重定向到网站的基本网址

1 个答案:

答案 0 :(得分:0)

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

我知道你在运行时不知道T中的Task<T>,解决这个问题的方法是等待结果并将其转换为对象。这应该有效:

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