我有以下情况:在.NET框架中可以为API控制器及其方法定义全局路由。通过获取默认值并添加控制器路由,您可以省略控制器的 [Route] 属性。除此之外,方法的路由是根据方法的名称改编的,因此您也可以在那里排除 [Route] 属性。
因此,当您映射例如“{controller}”并且有一个名为“MyController”的控制器+有一个名为“Post”的方法和一个名为“Delete”的方法时,您只需使用路由“MyController”并根据操作选择调用“Post”方法或“Delete”方法。
我想在 .NET 6 中实现相同的目标,但我不确定如何在这里实现这一目标。
我尝试过以下方法:
app.UseEndpoints(endpoints =>
{
IDictionary<string, object> defaults = new Dictionary<string, object>();
defaults.Add("controller", "{controller}");
endpoints.MapControllerRoute(name: "default", pattern: "{controller}", defaults: defaults);
endpoints.MapControllers();
});
目前还没有工作。一旦我开始休息服务,我就会收到缺少 [Route] 属性的错误。 有什么想法如何实现这一目标吗?
似乎您正在寻找默认常规路由的定义。
您可以像下面的示例一样定义它:
app.MapControllers();
app.UseRouting();
app.MapControllerRoute(
name: "default",
pattern: "{controller=your_default_controller}/{action=defaul_action}/{id?}");
但您应该考虑到,使用 REST API 的传统路由并不是最佳解决方案。 Microsoft 文档建议使用属性路由。
注意:如果要使用上面定义的传统路由,则应删除
[ApiController]
和 [Route("[controller]")]
属性,这些属性通常是默认添加的 .NET REST API 模板。
参见补充文章:
保留属性路由但只需在一个地方定义通用路由模板的另一种选择是使用具有路由模式的基本控制器类,并在所有控制器中继承它:
[ApiController]
[Route("api/[controller]")]
public class BaseApiController : ControllerBase
{ }
// this will have the route "api/WeatherForecast"
public class WeatherForecastController: BaseApiController
{
....
}
此选项是最灵活的,特别是如果您使用 Swagger,因为 它不支持传统的路由模板。