Как я могу остановить игнорирование пользовательского промежуточного программного обеспечения API .NET CORE?
Мое пользовательское промежуточное программное обеспечение .NET CORE API игнорируется, когда API получает сообщение. Это промежуточное программное обеспечение предназначено для выполнения некоторой проверки заголовка по любому заданному запросу.
Я ожидаю, что промежуточное программное обеспечение проверки заголовка будет вызвано как часть запроса, так что header.isValid покажет результат этой проверки. Когда я помещаю точку останова в контроллер, переменная заголовка пуста.
Я неправильно понимаю, что может сделать промежуточное программное обеспечение, ожидая, что оно будет взаимодействовать с контроллером. Все, что мне нужно для этого, - это действовать как привратник против плохих запросов, поэтому я был бы открыт для того, чтобы он прекратил плохие запросы и пропустил хорошие в качестве результата
Что я уже пробовал:
public interface IHeaderIsValid { bool isValid { get; set; } bool fromCMDS { get; set; } bool fromLocal { get; set; } Int16 transmittingInstallationID { get; set; } } public class HeaderIsValid : IHeaderIsValid { public bool isValid { get; set; } public bool fromCMDS { get; set; } public bool fromLocal { get; set; } public Int16 transmittingInstallationID { get; set; } }
public static class RequestHeaderMiddlewareExtensions { public static IApplicationBuilder UseHeaderValidation(this IApplicationBuilder app) { return app.UseMiddleware<RequestHeaderMiddleware>(); } } public class RequestHeaderMiddleware { #region CONSTRUCTORS /// <summary> /// The Request header middleware constructor /// </summary> /// <param name="next">navigation parameter to pass the request to the next pipeline item</param> public RequestHeaderMiddleware(RequestDelegate next) { _next = next; } #endregion #region PUBLIC METHJODS /// <summary> /// Invoke the middleware to validate the request header /// </summary> /// <param name="context">the context of the request</param> /// <returns>true or throws an exception</returns> public async Task Invoke(HttpContext context, IHeaderIsValid header) { try { header.isValid = false; bool hasInstallationID = Int16.TryParse(context.Request.Headers.FirstOrDefault(x => x.Key == "InstallationID").Value.ToString(), out this.transmittingInstallationID); if (!hasInstallationID) { throw new NoInstallationIDOnHeaderException("No Installation ID on the Request Header"); } string fromLocalHeader = context.Request.Headers.FirstOrDefault(x => x.Key == "FromLocal").Value.ToString(); if (fromLocalHeader != string.Empty) { bool.TryParse(fromLocalHeader, out this.fromLocal); } else { this.fromLocal = false; } bool hasFromCMDS = bool.TryParse(context.Request.Headers.FirstOrDefault(x => x.Key == "FromCMDS").Value.ToString(), out this.fromCMDS); if (!hasFromCMDS) { this.fromCMDS = false; } if (this.fromCMDS && this.fromLocal) { throw new FromCMDSAndFromLocalSetException("The FromLocal and FromCMDS indicators are both set on the request header"); } if (!this.fromCMDS && !this.fromLocal) { throw new NoOriginSetException("One of The FromLocal and FromCMDS indicators must be set on the request header"); } } catch (Exception ex) { throw ex; } header.isValid = true; await _next(context); } #endregion #region PRIVATE VARIABLES private readonly RequestDelegate _next; #endregion #region PUBLIC VARIABLES public Int16 transmittingInstallationID; public bool fromCMDS; public bool fromLocal; #endregion }
Затем в startup.cs (ConfigureServices обрезается для краткости)
public void ConfigureServices(IServiceCollection services) { services.AddScoped<IHeaderIsValid, HeaderIsValid>(); services.AddMvcCore() .AddAuthorization() .AddJsonFormatters(); } public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) { loggerFactory.AddLog4Net(); app.UseCors("default"); app.UseAuthentication(); app.UseMvc(); // My custom middleware to validate the header app.UseHeaderValidation(); } } }
Вот фрагмент из контроллера:
[Route("LDH/[controller]")] [ApiController] public class SalesController : ControllerBase { [Authorize] [HttpPost("ProcessPayment")] public async Task<ActionResult> ProcessPayment(WorkingTicket ticketDetails) { if (!header.isValid) { ModelState.AddModelError("BadHeader", "Request header is invalid"); return BadRequest(ModelState); } Return OK(); } private IHeaderIsValid header; }
cjb110
Это не заказ в "Настройка"? Попробуйте переместить свое промежуточное программное обеспечение в before UseAuth или UseMvc.
Ger Hayden
Вот как это. Очень ценю.