如果没有属性,路由不起作用
问题描述:
编辑:An issue has been opened在GitHub上澄清与答案中的信息的文档。如果没有属性,路由不起作用
我想在我的.NET Core MVC应用程序(对于API)中设置路由。我相信我有一切配置正确,但没有路线工作(所有返回404),除非行动具有显式设置的路由属性。同样的问题提到here,但他不知道什么解决了问题。
我把属性放回去,它工作。我删除了它们,但没有。最终通过移除和重新添加路由配置的一些神奇咒语 - 换句话说,关掉它并且换句话说 -
UseMvcWithDefaultRoute()
没有路由属性。不知道那里发生了什么。
这是我所拥有的简化版本。有什么问题?为什么没有设置属性就不能工作?
在这个例子中,我试图POST
到/login/register
。
Startup.cs
:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
})
.AddJsonOptions(options =>
options.SerializerSettings.ContractResolver =
new CamelCasePropertyNamesContractResolver());
public void Configure(IApplicationBuilder app,
IHostingEnvironment env,
ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseMvcWithDefaultRoute();
}
我也试过手动指定路线:
app.UseMvc(routes =>
{
routes.MapRoute(
"default",
"{controller=Home}/{action=Index}/{id?}");
});
登录控制器:
[Route("[controller]")]
[AllowAnonymous]
public class LoginController : Controller
{
[HttpPost]
[Route("register")] // only works with this here
public IActionResult Register([FromBody]RegisterModel model)
{
return Ok();
}
}
答
默认{controller=Home}/{action=Index}/{id?}
路线将已经映射控制器和行动/Login/Controller
。但是,如果在控制器上添加了[Route]
属性,则表明您要开始构建新路线,并且默认路线不再适用。因此,您必须从控制器和操作中删除属性或将其添加到两者。您可能还需要使用[action]
路线令牌以及:
[Route("[controller]/[action]")]
[AllowAnonymous]
public class LoginController : Controller
{
// ...
}
+0
非常感谢,非常感谢! – vaindil
您需要配置“路由”。这是ASP.net怎么知道其中的URL映射到控制器。有几种方法可以配置路由。你找到了其中两个。 [属性路由](http://www.asp.net/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2)和[路由表](http ://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api)。注意我的例子是针对WebAPI的,但概念很相似。 – Aron
@Aron'app.UseMvcWithDefaultRoute()'据说配置([source](https://docs.asp.net/projects/api/en/latest/autoapi/Microsoft/AspNetCore/Builder/MvcApplicationBuilderExtensions/#meth-Microsoft .AspNetCore.Builder.MvcApplicationBuilderExtensions.UseMvcWithDefaultRoute))。我在'app.UseMvc()'中尝试了一个显式路由,但仍然无法工作。 – vaindil
@vaindil,只是为了排除故障,删除策略,并尝试默认'services.AddMvc()'并从那里工作。逐渐添加一个新的作品,看看它是否有所作为。 – Nkosi