Asp.net web api 404找不到在使用Asp.net核心中间件和.map时获取响应
下面是我编写的一个中间件的代码片段,它接收api请求并验证它,然后发送响应 但当请求在那个时候有效时,它不调用API,它显示404NotFound错误 中间件代码段 启动 控制器代码段 它是一个简单的API,没有任何身份验证属性Asp.net web api 404找不到在使用Asp.net核心中间件和.map时获取响应,asp.net-web-api,asp.net-core,owin-middleware,Asp.net Web Api,Asp.net Core,Owin Middleware,下面是我编写的一个中间件的代码片段,它接收api请求并验证它,然后发送响应 但当请求在那个时候有效时,它不调用API,它显示404NotFound错误 中间件代码段 启动 控制器代码段 它是一个简单的API,没有任何身份验证属性 [Route("api/[controller]")] public class MoviesAPIController : Controller { IMovies _IMovies; public MoviesAPIController(IM
[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();
}
输出
依照
Map*扩展用作管道分支的约定。映射根据给定请求路径的匹配来分支请求管道。如果请求路径以给定路径开始,则执行分支
你需要像这样注册你的中间件
app.UseMiddleware<ApiKeyValidatorsMiddleware>();
中间件代码
或者也可以在地图中添加mvc。或者改用UseWhen。
[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();
}
app.UseMiddleware<ApiKeyValidatorsMiddleware>();
httpContext.Request.Path.StartsWithSegments("/api")
// 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>();
}
}