2016-08-18 63 views
3

編輯: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

回答

3

默認{controller=Home}/{action=Index}/{id?}路線將已經映射控制器和行動/Login/Controller。但是,如果在控制器上添加了[Route]屬性,則表明您要開始構建新路線,並且默認路線不再適用。因此,您必須從控制器和操作中刪除屬性或將其添加到兩者。您可能還需要使用[action]路線令牌以及:

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

非常感謝,非常感謝! – vaindil