使用 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);
}
我实现了这样的结果过滤器:
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);
}