404 not found Получает ответ при использовании ядра промежуточного программного обеспечения Asp.net с.map
Ниже приведен фрагмент кода, в котором я написал Middleware, который получает запрос API, проверяет его и отправляет ответ.
Но когда запрос действителен в то время, он не вызывает API, он показывает 404 Not Found Error.
Фрагмент кода промежуточного программного обеспечения
// You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project
public class ApiKeyValidatorsMiddleware
{
private readonly RequestDelegate _next;
IValidateRequest _IValidateRequest { get; set; }
public ApiKeyValidatorsMiddleware(RequestDelegate next , IValidateRequest ivalidaterequest)
{
_next = next;
_IValidateRequest = ivalidaterequest;
}
public async Task Invoke(HttpContext httpContext)
{
try
{
var queryString = httpContext.Request.Query;
StringValues keyvalue;
queryString.TryGetValue("key", out keyvalue);
if (httpContext.Request.Method != "POST")
{
httpContext.Response.StatusCode = 405; //Method Not Allowed
await httpContext.Response.WriteAsync("Method Not Allowed");
return;
}
if (keyvalue.Count == 0)
{
httpContext.Response.StatusCode = 400; //Bad Request
await httpContext.Response.WriteAsync("API Key is missing");
return;
}
else
{
var serviceName = httpContext.Request.Path.Value.Replace(@"/", string.Empty);
if (!_IValidateRequest.ValidateKeys(keyvalue) && !_IValidateRequest.IsValidServiceRequest(keyvalue, serviceName))
{
httpContext.Response.StatusCode = 401; //UnAuthorized
await httpContext.Response.WriteAsync("Invalid User Key");
return;
}
}
await _next.Invoke(httpContext);
}
catch (Exception)
{
throw;
}
}
}
// Extension method used to add the middleware to the HTTP request pipeline.
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ApiKeyValidatorsMiddleware>();
}
}
Запускать
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseSession();
//Middleware Call
app.Map("/api", appBuilder => appBuilder.UseMiddleware<ApiKeyValidatorsMiddleware>());
app.UseMvc(routes =>
{
routes.MapRoute(
name: "Servicedefault",
template: "{controller=Login}/{action=Login}/{ServiceID}/{ServiceName}");
routes.MapRoute(
name: "default",
template: "{controller=Login}/{action=Login}/{id?}");
});
}
Контроллер Codesnippet
Это простой API, который не имеет атрибута аутентификации.
[Route("api/[controller]")]
public class MoviesAPIController : Controller
{
IMovies _IMovies;
public MoviesAPIController(IMovies imovies)
{
_IMovies = imovies;
}
// GET: api/values
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
// POST api/values
[HttpPost]
public List<MoviesTB> Post([FromQuery]string key)
{
return _IMovies.GetMusicStore();
}
Выход
1 ответ
Согласно документации
Расширения Map* используются в качестве соглашения для ветвления конвейера. Карта разветвляет конвейер запросов на основе совпадений заданного пути запроса. Если путь запроса начинается с заданного пути, выполняется ветвь.
Вы должны зарегистрировать свою промежуточную посуду, как это
app.UseMiddleware<ApiKeyValidatorsMiddleware>();
и затем проверьте, является ли это вызовом API или нет в промежуточном программном обеспечении.
httpContext.Request.Path.StartsWithSegments("/api")
Код MiddleWare
// You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project
public class ApiKeyValidatorsMiddleware
{
private readonly RequestDelegate _next;
IValidateRequest _IValidateRequest { get; set; }
public ApiKeyValidatorsMiddleware(RequestDelegate next, IValidateRequest ivalidaterequest)
{
_next = next;
_IValidateRequest = ivalidaterequest;
}
public async Task Invoke(HttpContext httpContext)
{
try
{
if (httpContext.Request.Path.StartsWithSegments("/api"))
{
var queryString = httpContext.Request.Query;
StringValues keyvalue;
queryString.TryGetValue("key", out keyvalue);
if (httpContext.Request.Method != "POST")
{
httpContext.Response.StatusCode = 405; //Method Not Allowed
await httpContext.Response.WriteAsync("Method Not Allowed");
return;
}
if (keyvalue.Count == 0)
{
httpContext.Response.StatusCode = 400; //Bad Request
await httpContext.Response.WriteAsync("API Key is missing");
return;
}
else
{
var serviceName = httpContext.Request.Path.Value.Replace(@"/", string.Empty);
if (!_IValidateRequest.ValidateKeys(keyvalue) && !_IValidateRequest.IsValidServiceRequest(keyvalue, serviceName))
{
httpContext.Response.StatusCode = 401; //UnAuthorized
await httpContext.Response.WriteAsync("Invalid User Key");
return;
}
}
}
await _next.Invoke(httpContext);
}
catch (Exception)
{
throw;
}
}
}
// Extension method used to add the middleware to the HTTP request pipeline.
public static class MiddlewareExtensions
{
public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<ApiKeyValidatorsMiddleware>();
}
}