public static void UsePageNotFound(this IApplicationBuilder application, string notFoundUrl = "/Error/PageNotFound") { application.UseStatusCodePages(async context => { if (context.HttpContext.Response.StatusCode != 404 || (HttpRequestExtensions.IsAjaxRequest(context.HttpContext.Request) ? 1 : (HttpRequestExtensions.IsApiRequest(context.HttpContext.Request) ? 1 : 0)) != 0 || context.HttpContext.Request.IsStaticContentRequest()) { return; } var originalPath = context.HttpContext.Request.Path; var originalQueryString = context.HttpContext.Request.QueryString; context.HttpContext.Features.Set((IStatusCodeReExecuteFeature) new StatusCodeReExecuteFeature() { OriginalPathBase = context.HttpContext.Request.PathBase.Value, OriginalPath = originalPath.Value, OriginalQueryString = (originalQueryString.HasValue ? originalQueryString.Value : (string)null) }); context.HttpContext.Request.Path = (PathString)notFoundUrl; context.HttpContext.Request.QueryString = QueryString.Empty; try { await context.Next(context.HttpContext).ConfigureAwait(false); } finally { context.HttpContext.Request.QueryString = originalQueryString; context.HttpContext.Request.Path = originalPath; context.HttpContext.Features.Set((IStatusCodeReExecuteFeature)null); } }); }
public static bool IsApiRequest(HttpRequest request) { if (request == null) { throw new ArgumentNullException(nameof(request)); } return(HttpRequestExtensions.IsApiRequest(request.Path)); }