c# - WebAPI ActionFilter 等待 ExecuteActionFilterAsync 无结果

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

我尝试创建一个过滤器来修改内容。由于某种原因 var result = await actionContext.Request.Content.ReadAsStringAsync(); 不等待并返回空值。我确定有数据。直接在 Controller 和 header 内部检查。是否有解决方法。也可以阻塞(HttpContent 似乎只有异步方法)。

 public class AsyncAttribute : FilterAttribute, IActionFilter
{
    public async Task<HttpResponseMessage> ExecuteActionFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken,
        Func<Task<HttpResponseMessage>> continuation)
    {
        await InternalActionExecuting(actionContext, cancellationToken);

        if (actionContext.Response != null)
        {
            return actionContext.Response;
        }

        HttpActionExecutedContext executedContext;

        try
        {
            var response = await continuation();
            executedContext = new HttpActionExecutedContext(actionContext, null)
            {
                Response = response
            };
        }
        catch (Exception exception)
        {
            executedContext = new HttpActionExecutedContext(actionContext, exception);
        }

        await InternalActionExecuted(executedContext, cancellationToken);
        return executedContext.Response;
    }

    public virtual async Task InternalActionExecuting(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        //////////////////////////////////////////////////////////////////////////
        var result = await actionContext.Request.Content.ReadAsStringAsync();// <------------------------------------------------------
        //////////////////////////////////////////////////////////////////////////
    }

    public virtual async Task InternalActionExecuted(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
    {
    }
 }

最佳答案

  1. 您不应该在操作过滤器中访问正文,如果您有任何其他访问参数绑定(bind)中正文的内容,它可能已经不存在了。
  2. 为什么要在 Action 执行重载中调用 actionExecuted?模式是在操作运行之前调用一个,在操作运行之后调用一个。
  3. 出于某种原因,您似乎也在尝试在此方法中实现过滤器管道本身。

如果你想绑定(bind)正文中的数据,你推荐的替代方法是使用格式化程序。实现 MediaTypeFormatter 并将您需要的内容读入字符串。 See one example

我敢打赌,其他东西已经读取了正文流(从技术上讲,你已经完成了这一点),你可以先尝试倒带它(只有在缓冲模式下它才会起作用)。

关于c# - WebAPI ActionFilter 等待 ExecuteActionFilterAsync 无结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23623276/

相关文章:

angular - 如何从 Angular 4 中的 httppost 方法将整数值传递给 Controller ​​?

c# - 触发并忘记异步等待调用

javascript - 如何将 Promise.race 或 Promise.all 与异步迭代一起使用?

c# - 在这种情况下我应该抛出哪个 .Net 2.0 异常?

rest - Odata(V4) 操作是否只能通过 POST 调用?

c# - “参数字典包含空条目”错误,Web API

javascript - 重复异步函数直到 true

c# - Console.ReadKey 与带有计时器的 Console.ReadLine

c# - 在 foreach/for 中构建 where 子句的延迟查询

c# - 查询属性被修改的版本,如果属性被修改则选择一个标志