我实现了这样一个结果筛选器:
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)
{
}
}通过这样的通过MvcOptions配置ConfigureServices(IServiceCollection services)来使用过滤器:
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’(所讨论的方法将字符串作为返回值类型)。
我甚至可以使用IResultFilter来完成这个任务吗?
注意:我知道使用中间件完成响应包装的可能性。我不想使用中间件来实现这一点,因为中间件没有访问context.Result as ObjectResult的权限。从响应流反序列化,重新包装和序列化似乎是不必要的。
发布于 2017-11-02 11:35:29
我刚刚得到了一个答案。在设置objectResult.Value时,还需要设置objectResult.DeclaredType。
所以在这种情况下:
if (!(objectResult.Value is WrappedResponseBase))
{
objectResult.Value = new WrappedResponse(objectResult.Value);
objectResult.DeclaredType = typeof(WrappedResponse);
}https://stackoverflow.com/questions/47073838
复制相似问题