首页 > 解决方案 > ASP.NET 核心 Web API 路由

问题描述

  1. 使用“UseMvc”路由但无法调用控制器
  2. 在启动页面中添加了service.AddMvc方法和配置部分app.useMvc()
  3. 我无法路由,也无法弄清楚问题所在

控制器代码在这里并且有路由:动作方法Get带有参数类型startDateTime

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<CurrencyContext>(cfg => {
                  cfg.UseSqlServer(_config.GetConnectionString("BitCoinIndexConnectionString"));
    });

    services.AddMvc();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseStaticFiles();
    app.UseNodeModules(env);

    app.UseMvc(routes =>
                      {             
                          routes.MapRoute(name: "default",
                                          template: "api/{controller}/{action}/{start:DateTime}",
                                          defaults: new { 
                                                            controller = "Currency", 
                                                            action = "Get", 
                                                            start = DateTime.Now.AddDays(-14)});                          
                                                        });
                      }
}

[Route("api/[Controller]")]
public class CurrencyController : Controller
{
    private BitCoinRepository<BitCoinIndex> _repository;

    public CurrencyController(BitCoinRepository<BitCoinIndex> repository)
    {
        _repository = repository;
    }

    // GET: api/<controller>
    [HttpGet("{start}",Name ="Get")]
    public IActionResult Get(DateTime start)
    {
        // var bci =  _repository.GetByDates(start).ToDictionary(t => t.Date.ToString(), t => t.Rate);
        return View();    
    }
}

标签: asp.net-coreasp.net-core-mvcasp.net-core-webapi

解决方案


我遇到了同样的问题并使用属性路由解决了它。这就是我所做的。如果您不使用 .Net Core 3,请忽略第 1 点。

第一次通过在您的以下添加禁用端点路由ConfigureServices

services.AddMvc(options => options.EnableEndpointRouting = false);

您现在可以在Configure方法中使用它

app.UseMvc();

接下来,只需在控制器内定义您的路由(请记住,我通常更喜欢通过向路由表添加路由来进行路由,但是在执行此“路由”时遇到了不必要的问题,属性路由是最容易采用的“路由”)。

[Route("api/myctrl")]
[ApiController]
public class MyControllerController : ControllerBase
{
    [HttpGet]
    [Route("getsomething")]
    public async Task<JsonResult> DoStuff()
    {

    }

}

通过使用@Url.Action("DoStuff", "MyController");或访问它/api/myctrl/getsomething


推荐阅读