我正在使用 Azure 函数并尝试使用 IFunctionExceptionFilter 和 IHttpContextAccessor 编写通用异常过滤器。它有效,我可以在响应中设置 header 变量。但是,无论我尝试什么,响应主体都是空白的。
public abstract class BaseAPI : IFunctionExceptionFilter
{
private readonly IHttpContextAccessor httpContextAccessor;
protected BaseAPI(IHttpContextAccessor httpContextAccessor)
{
this.responseValidator = responseValidator;
}
public async Task OnExceptionAsync(FunctionExceptionContext exceptionContext, CancellationToken cancellationToken)
{
httpContextAccessor.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
httpContextAccessor.HttpContext.Response.Headers.Append("MyHeader", "Foo"); // this works and appears
await httpContextAccessor.HttpContext.Response.WriteAsync("Some text"); // this is not shown in the response
}
}
我必须做什么才能让 body react 出现?我试过直接使用 Response.Body,但没有任何区别。
最佳答案
我只是在寻找合适的 OnExceptionAsync 实现时偶然发现了这个问题。代码中唯一缺少的是响应内容类型和长度。
public async Task OnExceptionAsync(FunctionExceptionContext exceptionContext, CancellationToken cancellationToken)
{
var text = "Some text"; // text variable
httpContextAccessor.HttpContext.Response.StatusCode = StatusCodes.Status500InternalServerError;
httpContextAccessor.HttpContext.Response.ContentType = "text/html; charset=UTF-8"; // Missing part
httpContextAccessor.HttpContext.Response.Headers.Append("MyHeader", "Foo");
await httpContextAccessor.HttpContext.Response.WriteAsync(text);
httpContextAccessor.HttpContext.Response.ContentLength = text.Length; // Missing part
}
已在 Firefox、Chrome 和 Edge 中测试。希望对您有所帮助。
更新,来自@ChrisHG,缺少一个字符串
httpContextAccessor.HttpContext.Response.CompleteAsync()
或者,我现在使用的字符串。
await response.WriteAsync(errorMessage, Encoding.UTF8, cancellationToken);
关于azure-functions - IFunctionExceptionFilter 和编写响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59769608/