У меня есть промежуточное программное обеспечение, которое должно перехватывать мои исключения и правильно устанавливать код ответа Http при возникновении исключений, но, похоже, что независимо от того, что я делаю, я все равно получаю хороший ответ.
Вот промежуточное ПО
public class ErrorHandlingMiddleware
{
private readonly RequestDelegate _next;
/// <inheritdoc />
public ErrorHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
/// <summary>
/// Called by execution pipeline
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public async Task Invoke(HttpContext context /* other dependencies */)
{
try
{
await _next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception ex)
{
var code = HttpStatusCode.InternalServerError; // 500 if unexpected
var result = JsonConvert.SerializeObject(new { error = ex.Message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}
Он добавлен в мой стартап примерно так:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMiddleware(typeof(ErrorHandlingMiddleware));
if (env.IsDevelopment())
{
//app.UseDeveloperExceptionPage();
}else
{
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles(new StaticFileOptions
{
ServeUnknownFileTypes = true
});
app.UseDefaultFiles();
app.UseCookiePolicy();
app.UseMvc();
app.UseCors("CorsPolicy");
app.UseMvcWithDefaultRoute();
app.UseSwaggerAndUI(Configuration)
.UseCustomHealthCheck();
}
Код, выдавший ошибку:
public Task<string> SaveFileAsync(string path, byte[] file, string fileType, CancellationToken cancellationToken = default)
{
var filename = _filenameProvider.GetFilename(path, fileType);
var fullPath = _fileSystem.Path.Combine(path, filename).Replace('/', '\\');
try
{
_fileSystem.Directory.CreateDirectory(fullPath);
// Error in the FileSystem abstraction library: https://github.com/System-IO-Abstractions/System.IO.Abstractions/issues/491
//await _fileSystem.File.WriteAllBytesAsync(fullPath, file, cancellationToken);
_fileSystem.File.WriteAllBytes(fullPath, file);
return Task.FromResult(filename);
}
catch (Exception ex)
{
Log.Error(ex.Message, nameof(SaveFileAsync), _userId);
throw;
}
}
А контроллер это:
public class PatientDocumentController : BaseController
{
private readonly IPatientFilePusher _patientFilePusher;
/// <inheritdoc />
public PatientDocumentController(IPatientFilePusher filePusher)
{
_patientFilePusher = filePusher;
}
/// <summary>
/// Pushes a patient file to the emr
/// </summary>
/// <param name="request">Contains the file data.</param>
/// <param name="token">A auto-generated token that allows for halting execution.</param>
/// <returns>Ok when complete.</returns>
[HttpPost]
public async Task<IActionResult> PushPatientDemographicsAsync([FromBody] FilePushRequest request, CancellationToken token)
{
await _patientFilePusher.PushFileAsync(request, token);
return Ok();
}
}
Тело ответа, которое возвращается, включает исключение, но код статуса Http остается равным 200. Ветвь catch
на моем промежуточном программном обеспечении никогда не вызывается.