public class ErrorHandlingMiddleware
{
private readonly RequestDelegate next;
private readonly ILogger logger;
public ErrorHandlingMiddleware(RequestDelegate next,
ILoggerFactory loggerFactory)
{
this.next = next;
logger = loggerFactory.CreateLogger<ErrorHandlingMiddleware>();
}
public async Task Invoke(HttpContext context)
{
try
{
await next(context);
}
catch (Exception ex)
{
logger.LogError(0, ex, "An unhandled exception has occurred: " + ex.StackTrace);
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception exception)
{
var code = HttpStatusCode.InternalServerError;
var message = exception.Message;
if (exception is BadRequestException)
{
code = HttpStatusCode.BadRequest;
}
else if (exception is NotFoundException)
{
code = HttpStatusCode.NotFound;
}
else if (exception is NotAuthorizedException)
{
code = HttpStatusCode.Forbidden;
}
else if (exception is NotAuthenticatedException)
{
code = HttpStatusCode.Unauthorized;
}
else
{
message = "An unexpected error occurred.";
}
var result = JsonConvert.SerializeObject(new { error = message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)code;
return context.Response.WriteAsync(result);
}
}
我如何配置我的web应用程序,使它识别一个坏的API路由,并返回一个404?
更新这里是我在启动类中加载中间件的地方/时候:
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifetime, IOptions<OidcConfig> oidcConfigOptions)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
// Add Serilog to the logging pipeline
loggerFactory.AddSerilog();
app.UseMiddleware<ErrorHandlingMiddleware>();
if (env.IsLocal())
{
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions
{
HotModuleReplacement = true
});
}
var oidcConfig = oidcConfigOptions.Value;
// Configure the app to use Jwt Bearer Authentication
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Authority = oidcConfig.GetAuthority(),
Audience = oidcConfig.ResourceAppId,
TokenValidationParameters = new TokenValidationParameters
{
RequireExpirationTime = true,
RequireSignedTokens = true,
ValidateAudience = true,
ValidIssuer = oidcConfig.GetIssuer(),
ValidateIssuer = true,
ValidateActor = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true
},
});
app.UseSiteIdClaimInjection();
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
routes.MapSpaFallbackRoute(
name: "spa-fallback",
defaults: new { controller = "Home", action = "Index" });
});
appLifetime.ApplicationStopped.Register(() => this.ApplicationContainer.Dispose());
}
引用ASP.NET核心中间件基础-排序
在Configure方法中添加中间件组件的顺序定义了在请求中调用它们的顺序,以及响应的相反顺序。这种排序对于安全性、性能和功能至关重要。
Configure方法(如下所示)添加了以下中间件组件:
public void Configure(IApplicationBuilder app)
{
app.UseExceptionHandler("/Home/Error"); // Call first to catch exceptions
// thrown in the following middleware.
app.UseStaticFiles(); // Return static files and end pipeline.
app.UseIdentity(); // Authenticate before you access
// secure resources.
app.UseMvcWithDefaultRoute(); // Add MVC to the request pipeline.
}
根据OP中提供的代码和引用的文档,我建议将您的异常更早或更早地添加到管道中。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IApplicationLifetime appLifetime) {
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
loggerFactory.AddSerilog();
app.UseMiddleware<ErrorHandlingMiddleware>(); // Call first to catch exceptions
// thrown in the following middleware.
if (env.IsLocal()) {
app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions { HotModuleReplacement = true });
}
//Bunch of other stuff
}
根据备注进行更新。
我怀疑是管道下游的一个中间件导致了这个问题。尝试一个接一个地移除它们,并检查是否得到相同的行为,以便缩小哪一个是罪魁祸首。
我正在用开发一个Web API。Net内核,我需要允许客户端上载文件列表(主要是图像)并将其保存到服务器。 我正在使用ASP。NET核心3.0 这是我的启动文件Startup.cs: 这是我的ImageController文件ImageController。反恐精英: 我试图通过POST操作使用POSTMAN上传图像。我将REQUEST分配给POST,并在Body标签下使用form data,并将
我搞不懂,怎么写一本书。NET核心Web API支持文件上传。请注意,我没有使用ASP。NET核心MVC表单,用于文件上载,但通过Servlet/JSP容器。以下是我的项目是如何完成的。定义了json, 以下是我的创业定义, 最后这里是如何定义我的控制器, 我经历过这个环节,https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-u
.NET核心和ASP.NET核心到底有什么区别?
在使用WebSphere Liberty Core时,我在日志中随机看到以下错误(WLC:8.5.5.1(WLP-1.0.3.20130510-0831))。在其他应用程序服务器上,这种情况不会发生。我不知道这在代码中发生在哪里...看起来就像Spring3.1.3试图做一些无序的事情。有人解决过这个吗?
回到RC1,我会这样做: 在RC2中,不再有,并且没有任何东西可以让我返回500类型的IActionResult。 我现在问的方法完全不同了吗?我们是否不再尝试捕获代码?我们是否只是让框架将一个泛型500异常抛回API调用者?对于开发,如何查看确切的异常堆栈?
IServiceProvider是一个具有单一方法的接口: 它用于创建已注册的类型的实例。NET Core原生DI容器。 可以通过调用IServiceCollection的方法来获得IServiceProvider自身的实例。它似乎是通过框架的实例神奇地调用的。 我想创建一个的实例,而不需要方法。我需要它来解决集成测试程序集中的依赖关系。在这种情况下有可能得到它吗?