.NET Core 和 MVC 项目,api 控制器路由不起作用
.NET Core and MVC project, api controller route not working
在使用 VS 2017 创建的项目(包括 MVC 和 Web API)中,当我添加一个新控制器时,默认路由调用 Index() 函数到那个新的 API 控制器但是浏览到任何其他方法都失败。
API代码
namespace TestApi.Controllers
{
[Produces("application/json")]
[Route("api/TestAPI")]
public class TestAPIController : Controller
{
public string Index()
{
//if (!_signInManager.IsSignedIn(User))
//return RedirectToAction("Login", "Account");
return "View()";
}
//[Route("GetTestData")]
[HttpGet]
private string GetTestData()
{
return "Data";
}
}
}
Startup class 中的代码如下:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IUrlHelper>(factory =>
{
var actionContext = factory.GetService<IActionContextAccessor>()
.ActionContext;
return new UrlHelper(actionContext);
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// Add application services.
services.AddTransient<IEmailSender, EmailSender>();
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
因此浏览到“https://localhost:44314/api/TestAPI" works but when i try to browse to "https://localhost:44314/api/TestAPI/GetTestData”时出现找不到页面错误。
感谢您的帮助。
可能是您的 GetTestData 操作方法是私有的。尝试制作 public.
使用这个:
[Route("api/[controller]/[action]")]
public class TestAPIController : Controller
{
}
然后您可以浏览所有操作。
但可能想要更改动作名称,因此您应该这样编码:
[Route("api/[controller]/[action]")]
public class TestAPIController : Controller
{
[ActionName("start-here")]
public JsonResult Start()
{
return Json();
}
}
并且您可以使用如下参数为操作指定特定路径:
[Route("api/[controller]/[action]")]
public class TestAPIController : Controller
{
[ActionName("start-here")]
public JsonResult Start()
{
return Json();
}
[route("api/[controller]/nearby-businesses/{locationType}")]
public JsonResult nearby_businesses(string locationType)
{
return Json();
}
}
在使用 VS 2017 创建的项目(包括 MVC 和 Web API)中,当我添加一个新控制器时,默认路由调用 Index() 函数到那个新的 API 控制器但是浏览到任何其他方法都失败。
API代码
namespace TestApi.Controllers
{
[Produces("application/json")]
[Route("api/TestAPI")]
public class TestAPIController : Controller
{
public string Index()
{
//if (!_signInManager.IsSignedIn(User))
//return RedirectToAction("Login", "Account");
return "View()";
}
//[Route("GetTestData")]
[HttpGet]
private string GetTestData()
{
return "Data";
}
}
}
Startup class 中的代码如下:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IActionContextAccessor, ActionContextAccessor>();
services.AddScoped<IUrlHelper>(factory =>
{
var actionContext = factory.GetService<IActionContextAccessor>()
.ActionContext;
return new UrlHelper(actionContext);
});
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddIdentity<ApplicationUser, IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// Add application services.
services.AddTransient<IEmailSender, EmailSender>();
services.AddMvc();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseBrowserLink();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
}
app.UseStaticFiles();
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
}
}
因此浏览到“https://localhost:44314/api/TestAPI" works but when i try to browse to "https://localhost:44314/api/TestAPI/GetTestData”时出现找不到页面错误。
感谢您的帮助。
可能是您的 GetTestData 操作方法是私有的。尝试制作 public.
使用这个:
[Route("api/[controller]/[action]")]
public class TestAPIController : Controller
{
}
然后您可以浏览所有操作。
但可能想要更改动作名称,因此您应该这样编码:
[Route("api/[controller]/[action]")]
public class TestAPIController : Controller
{
[ActionName("start-here")]
public JsonResult Start()
{
return Json();
}
}
并且您可以使用如下参数为操作指定特定路径:
[Route("api/[controller]/[action]")]
public class TestAPIController : Controller
{
[ActionName("start-here")]
public JsonResult Start()
{
return Json();
}
[route("api/[controller]/nearby-businesses/{locationType}")]
public JsonResult nearby_businesses(string locationType)
{
return Json();
}
}