使用 IResultFilter 包装 ASP.NET 核心 WebAPI 方法的结果

Wrapping results of ASP.NET Core WebAPI methods using IResultFilter

我实现了这样的结果过滤器:

public class ResultWrapperFilter : IResultFilter
{
    public void OnResultExecuting(ResultExecutingContext context)
    {
        if (!(context.ActionDescriptor is ControllerActionDescriptor))
        {
            return;
        }

        var objectResult = context.Result as ObjectResult;
        if (objectResult == null)
        {
            return;
        }

        if (!(objectResult.Value is WrappedResponseBase))
        {
            objectResult.Value = new WrappedResponse(objectResult.Value);
        }
    }

    public void OnResultExecuted(ResultExecutedContext context)
    {
    }
}

通过 ConfigureServices(IServiceCollection services) 配置 MvcOptions 使用过滤器,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(
            options => { options.Filters.AddService<ResultWrapperFilter>(); });
    services.AddMvc();

    // ... the rest is omitted for readability
}

我遇到的问题是此过滤器导致 InvalidCastException:无法将类型 'WrappedResponse' 的对象转换为类型 'System.String'(有问题的方法将字符串作为 return 值类型).

我什至可以使用 IResultFilter 执行此操作吗?

注意: 我知道可以使用中间件来完成响应包装。我不想使用中间件来完成此操作,因为中间件无法访问 context.Result as ObjectResult。从响应流中反序列化,再次包装和序列化似乎没有必要。

我刚刚得到了答案。 设置objectResult.Value时,还需要设置objectResult.DeclaredType

所以在这种情况下:

if (!(objectResult.Value is WrappedResponseBase))
{
    objectResult.Value = new WrappedResponse(objectResult.Value);
    objectResult.DeclaredType = typeof(WrappedResponse);
}