我的要求是,当操作的返回类型为void或Task时,我想返回自定义ApiResult
。我尝试了中间件机制,但是观察到的响应对于ContentLength和ContentType都为null,而我想要的是ApiResult
空实例的json表示形式。
那我应该在哪里进行转换?
答案 0 :(得分:1)
.net核心中有多个过滤器,您可以尝试Result filters。
对于void
或Task
,它将在EmptyResult
中返回OnResultExecutionAsync
。
尝试像
那样实现自己的ResultFilter
public class ResponseFilter : IAsyncResultFilter
{
public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
// do something before the action executes
if (context.Result is EmptyResult)
{
context.Result = new JsonResult(new ApiResult());
}
var resultContext = await next();
// do something after the action executes; resultContext.Result will be set
}
}
public class ApiResult
{
public int Code { get; set; }
public object Result { get; set; }
}
并在Startup.cs
services.AddScoped<ResponseFilter>();
services.AddMvc(c =>
{
c.Filters.Add(typeof(ResponseFilter));
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
答案 1 :(得分:0)
您要做的就是检查返回类型,并在返回的基础上执行所需的任何操作。
这是抽象的演示: 您有一个方法:
public Action SomeActionMethod()
{
var obj = new object();
return (Action)obj;
}
现在在您的代码中,您可以使用以下代码获取方法的名称:
MethodBase b = p.GetType().GetMethods().FirstOrDefault();
var methodName = ((b as MethodInfo).ReturnType.Name);
上面代码中的p是包含要知道其返回类型的方法的类。
获得方法名后,您可以确定变量methodName
的返回值。
希望有帮助。