Я использую dotnet core 2. * и, как упоминается в заголовке, у меня возникли проблемы с тем, чтобы уловить попытку выполнения при вызове из API.И прежде чем кто-то прокомментирует, я также запускаю промежуточное ПО для обнаружения любых исключений.Он также не работает должным образом
Дополнительная информация:
- Два класса находятся в разных пространствах имен / проектах
- Запросы. Аутентификация статическая.
- Они оба находятся в одном решении
Контроллер :
[AllowAnonymous]
[HttpPost]
public string Login([FromBody] AuthRequest req)
{
// See if the user exists
if (Authenticate(req.username, req.password))
{
try {
// Should Fail Below
UserDetails ud = Queries.Authentication.GetUser(req.username);
} catch (RetrievalException e){ }
catch (Exception e){ } // Exception Still Comes Through
}
}
Queries.Authentication.GetUser Code :
public static class Authentication {
public static UserDetails GetUser (string username)
{
// Some Code
if (details.success)
{
// Some Code
}
else
{
throw new RetrievalException(details.errorMessage); // This is not caught propperly
}
}
}
Исключение получения :
public class RetrievalException : Exception
{
public RetrievalException()
{
}
public RetrievalException(String message)
: base(message)
{
}
public RetrievalException(String message, Exception inner)
: base(message, inner)
{
}
}
РЕДАКТИРОВАТЬ: Добавление кода промежуточного программного обеспечения Здесь по запросу:
public class CustomExceptionFilter : IExceptionFilter
{
public void OnException(ExceptionContext context)
{
HttpStatusCode status = HttpStatusCode.InternalServerError;
String message = String.Empty;
var exceptionType = context.Exception.GetType();
if (exceptionType == typeof(UnauthorizedAccessException))
{
message = "Unauthorized Access";
status = HttpStatusCode.Unauthorized;
}
else if (exceptionType == typeof(NullReferenceException))
{
message = "Null Reference Exception";
status = HttpStatusCode.InternalServerError;
}
else if (exceptionType == typeof(NotImplementedException))
{
message = "A server error occurred.";
status = HttpStatusCode.NotImplemented;
}
else if (exceptionType == typeof(RSClientCore.RetrievalException))
{
message = " The User could not be found.";
status = HttpStatusCode.NotFound;
}
else
{
message = context.Exception.Message;
status = HttpStatusCode.NotFound;
}
context.ExceptionHandled = true;
HttpResponse response = context.HttpContext.Response;
response.StatusCode = (int)status;
response.ContentType = "application/json";
var err = "{\"message\":\"" + message + "\",\"code\" :\""+ (int)status + "\"}";
response.WriteAsync(err);
}
}
Конфигурация приложения:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
} else
{
app.UseExceptionHandler();
}
...
}
Конфигурация службы:
public void ConfigureServices(IServiceCollection services)
{
// Add Model View Controller Support
services.AddMvc( config =>
config.Filters.Add(typeof (CustomExceptionFilter))
);
ОБНОВЛЕНИЕ: После игры с нимЯ заметил, что даже если моя программа выдает исключение, если я нажимаю «Продолжить», контроллер API обрабатывает его так, как если бы исключение не было выдано (так как оно ловит его и делает то, что я хочу).Таким образом, я отключил перерыв в настройках исключения, это исправило это в режиме отладчика.Однако этот перерыв, кажется, не является проблемой при сборке / публикации программы.Это заставляет меня думать, что это определенно проблема с самой Visual Studio, а не с кодом.