我对中间件层次结构有疑问。我用一个控制器/动作创建了非常简单的 web api
[Route("api/v1/values")]
public class ValuesController : Controller
{
// GET api/v1/values/5
[HttpGet("{id}")]
public async Task<IActionResult> Get(string id)
{
return await Task.Run<IActionResult>(() =>
{
if (id == "nf")
{
return NotFound();
}
return Ok($"value: {id}");
});
}
}
如果匹配,我将路由配置为使用 Mvc,如果不匹配,则将 Default 写入响应。
app.UseMvc();
app.Use(async (context, next) =>
{
await context.Response.WriteAsync("Default");
});
这很好用,您可以在下面看到示例请求/响应:
/api/v1/values/1 -> 200, Body: "value: 1"
/api/v1/values/nf -> 404
/api/v1/values -> "Default"
很好,但后来我添加了 ApiVersioning,所以控制器看起来像这样:
[ApiVersion("1")]
[Route("api/v{version:apiVersion}/values")]
public class ValuesController : Controller
我添加到 Startup : services.AddApiVersioning();
。它完全破坏了路由,现在对于每个请求,我都会得到响应“默认”,当我删除最后一个应用程序时。使用,路由适用于值控制器,但我没有默认中间件。你知道我如何获得与以前相同的响应,但使用 ApiVersioning 吗?