我想在.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方法,并且我不想更改每种操作方法的网址。
任何帮助将不胜感激。
答案 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");
});