当前位置: 首页 > 知识库问答 >
问题:

如何在坏的.NET核心API路由上抛出404?

谯英彦
2023-03-14
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());
}

共有1个答案

郑曜灿
2023-03-14

引用ASP.NET核心中间件基础-排序

在Configure方法中添加中间件组件的顺序定义了在请求中调用它们的顺序,以及响应的相反顺序。这种排序对于安全性、性能和功能至关重要。

Configure方法(如下所示)添加了以下中间件组件:

    null
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自身的实例。它似乎是通过框架的实例神奇地调用的。 我想创建一个的实例,而不需要方法。我需要它来解决集成测试程序集中的依赖关系。在这种情况下有可能得到它吗?