如果没有属性,路由不起作用

问题描述:

编辑: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(); 
    } 
} 
+0

您需要配置“路由”。这是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

+0

@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

+0

@vaindil,只是为了排除故障,删除策略,并尝试默认'services.AddMvc()'并从那里工作。逐渐添加一个新的作品,看看它是否有所作为。 – Nkosi

默认{controller=Home}/{action=Index}/{id?}路线将已经映射控制器和行动/Login/Controller。但是,如果在控制器上添加了[Route]属性,则表明您要开始构建新路线,并且默认路线不再适用。因此,您必须从控制器和操作中删除属性或将其添加到两者。您可能还需要使用[action]路线令牌以及:

[Route("[controller]/[action]")] 
[AllowAnonymous] 
public class LoginController : Controller 
{ 
    // ... 
} 
+0

非常感谢,非常感谢! – vaindil