4

我对中间件层次结构有疑问。我用一个控制器/动作创建了非常简单的 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 吗?

4

1 回答 1

0

尝试这个。

[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/foo")]
public class FooController {}

并在启动类

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddApiVersioning(options =>
            {
                options.ReportApiVersions = true;
                options.AssumeDefaultVersionWhenUnspecified = true;
                options.DefaultApiVersion = new ApiVersion(1, 0);
            });
        }

我已经尝试过了,它对我有用。

于 2017-09-13T12:56:59.957 回答