在.Net Core中使用Swagger在API方法中设置自定义路径前缀

时间:2018-12-19 10:16:36

标签: asp.net asp.net-mvc asp.net-core .net-core swagger

我想在.Net Core API方法中使用摇摇欲坠地添加我的自定义路径前缀

例如,我的API方法声明如下:

[Route("api/v1/Customer")]
[HttpGet]
public async Task<IActionResult> Customer()
{
        // some implementation
        return Ok();
}

因此,当前,如果我使用http://localhost:50523/api/v1/Customer调用API,它就可以正常工作。

现在,我想添加一些自定义路径前缀。例如。 /some/custom/path/在实际API方法路径之前。这意味着-如果我使用http://localhost:50523/some/custom/path/api/v1/Customer调用API,它将正常工作。

我想在.Net核心中使用Swagger实现此目的,并且我不想在操作方法级别更改API路径,因为我已经编写了数百种API方法,并且我不想更改每种操作方法的网址。

任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:0)

也许您可以在Controller类中使用Route属性,例如:      [Route("/some/custom/path/")] public class CustomerController { [Route("api/v1/Customer")] [HttpGet] public async Task<IActionResult> Customer() { // some implementation return Ok(); } }

希望它对您有用

答案 1 :(得分:0)

如果添加DocumentFilter,则可以将前缀添加到要更改的所有路径。

public class PathPrefixInsertDocumentFilter : IDocumentFilter
{
    private readonly string _pathPrefix;

    public PathPrefixInsertDocumentFilter(string prefix)
    {
        this._pathPrefix = prefix;
    }

    public void Apply(SwaggerDocument swaggerDoc, DocumentFilterContext context)
    {
        var paths = swaggerDoc.Paths.Keys.ToList();
        foreach (var path in paths)
        {
            var pathToChange = swaggerDoc.Paths[path];
            swaggerDoc.Paths.Remove(path);
            swaggerDoc.Paths.Add(new KeyValuePair<string, PathItem>("/" + _pathPrefix + path, pathToChange));
        }
    }
}

然后将过滤器添加到您的招摇设置中:

        services.AddSwaggerGen(options =>
        {
            options.SwaggerDoc("v1", new Info {Title = "MyApp", Version = "v1"});

            ...  other setup

            options.DocumentFilter<PathPrefixInsertDocumentFilter>("api");
        });

这不会改变您的API-我们将其用于生产中的反向代理,在反向生产中,我们使用前缀将请求路由到适当的容器,但将其剥离。

答案 2 :(得分:0)

您可以在API控制器的顶部使用 [Route("prefix/[controller]")]

[Route("prefix/[controller]")]
public class MyController : ControllerBase
{
  [Route("api/v1/Customer")]
  [HttpGet]
   public async Task<IActionResult> Customer()
   {
    // some implementation
    return Ok();
    }
}

答案 3 :(得分:0)

在 .Net 5.0 中

public class PathPrefixInsertDocumentFilter : IDocumentFilter
{
    private readonly string _pathPrefix;

    public PathPrefixInsertDocumentFilter(string prefix)
    {
        this._pathPrefix = prefix;
    }

    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        var paths = swaggerDoc.Paths.Keys.ToList();
        foreach (var path in paths)
        {
            var pathToChange = swaggerDoc.Paths[path];
            swaggerDoc.Paths.Remove(path);
            swaggerDoc.Paths.Add($"{_pathPrefix}{path}", pathToChange);
        }
    }
}

应用过滤器

services.AddSwaggerGen(options =>
{
    options.SwaggerDoc("v1", new Info {Title = "MyApp", Version = "v1"});

    ...  other setup

    options.DocumentFilter<PathPrefixInsertDocumentFilter>("api");
});