在ASP.net Core 2.1中,我想返回一个Json响应以及状态代码415,而不是默认返回的只是415。
要实现这一点,我正在使用资源过滤器:
public class MediaTypeResouceFilter : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
if (context.HttpContext.Response.StatusCode == 415)
{
context.Result = new ContentResult() { StatusCode = 415, Content = JsonConvert.SerializeObject(myResponse), ContentType = "application/json" };
}
}
}
在调试中,我看到了上下文。结果被成功覆盖,但邮递员只得到415,没有Json响应。
如果我放:
context.Result = new ContentResult() { StatusCode = 415, Content = JsonConvert.SerializeObject(myResponse), ContentType = "application/json" };
在OnResourceExecuting内而不是OnResourceExecuted内,它按我的意愿工作,但问题是我无法在执行资源之前检查状态代码。
为什么会这样?
答案 0 :(得分:3)
你可以试试吗?
public class MediaTypeResouceFilter : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
if (context.HttpContext.Response.StatusCode == 415)
{
var jsonString = JsonConvert.SerializeObject(new { data = "this is custom message" });
byte[] data = Encoding.UTF8.GetBytes(jsonString);
context.HttpContext.Response.Body.WriteAsync(data, 0, data.Length);
}
}
}
然后您将获得415状态码,并且正文数据为:{"data":"this is custom message"}
实际上OnResourceExecuted
触发得太晚了,但是您可以修改自定义消息的正文
答案 1 :(得分:2)
我认为使用中间件组件是一个不错的选择。这是中间件的Invoke方法:
public async Task Invoke(HttpContext context) {
Exception exception = null;
try {
await _next(context);
}
catch (Exception e) {
exception = e;
//try handling exception stuff...
}
//try handling 415 code stuff...
if(context.Response.StatusCode==415){
var yourJsonObj = new { Blah = "blah..." };
string result = JsonConvert.SerializeObject(yourJsonObj);
//context.Response.StatusCode = 200; //You can change the StatusCode here
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(result);
}
}
答案 2 :(得分:1)
通过Microsoft查看工作流程:
IResourceFilter::OnResourceExecuted(ResourceExecutedContext context)
的方法在结果执行后运行。由于结果执行已经完成,因此您无法更改结果。