2016-08-18 3 views
3

EDIT: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). NB мои примеры для WebAPI, но концепция похожа. – Aron

+0

@Aron 'app.UseMvcWithDefaultRoute()' предположительно настраивает это ([источник] (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