В случае, если вы используете ASP.NET 5 с ASP.NET MVC 6 , большинство из этих ответов просто не будут работать, потому что вы обычно позволяете MVC создавать соответствующий набор маршрутов для вас (с использованием соглашений RESTful по умолчанию), что означает, что вы не найдете ни одного Routes.MapRoute()
вызова для редактирования по желанию.
Метод ConfigureServices()
, вызванный файлом Startup.cs
, зарегистрирует MVC с интегрированной средой Dependency Injection, встроенной в ASP.NET 5: таким образом, когда вы вызовете ApplicationBuilder.UseMvc()
позже в этом классе, инфраструктура MVC автоматически добавит эти маршруты по умолчанию для вашего приложения. Мы можем взглянуть на то, что происходит за укрытием, посмотрев реализацию метода UseMvc()
в исходном коде фреймворка:
public static IApplicationBuilder UseMvc(
[NotNull] this IApplicationBuilder app,
[NotNull] Action<IRouteBuilder> configureRoutes)
{
// Verify if AddMvc was done before calling UseMvc
// We use the MvcMarkerService to make sure if all the services were added.
MvcServicesHelper.ThrowIfMvcNotRegistered(app.ApplicationServices);
var routes = new RouteBuilder
{
DefaultHandler = new MvcRouteHandler(),
ServiceProvider = app.ApplicationServices
};
configureRoutes(routes);
// Adding the attribute route comes after running the user-code because
// we want to respect any changes to the DefaultHandler.
routes.Routes.Insert(0, AttributeRouting.CreateAttributeMegaRoute(
routes.DefaultHandler,
app.ApplicationServices));
return app.UseRouter(routes.Build());
}
Хорошо в этом то, что фреймворк теперь выполняет всю тяжелую работу, перебирая все действия контроллера и устанавливая их маршруты по умолчанию, тем самым сохраняя вам некоторую избыточную работу.
Плохо то, что мало или нет документации о том, как вы могли бы добавить свои собственные маршруты. К счастью, вы можете легко сделать это с помощью подхода на основе и / или на основе атрибутов (он же маршрутизация атрибутов ).
Конвенция на основе
В вашем классе Startup.cs замените это:
app.UseMvc();
с этим:
app.UseMvc(routes =>
{
// Route Sample A
routes.MapRoute(
name: "RouteSampleA",
template: "MyOwnGet",
defaults: new { controller = "Items", action = "Get" }
);
// Route Sample B
routes.MapRoute(
name: "RouteSampleB",
template: "MyOwnPost",
defaults: new { controller = "Items", action = "Post" }
);
});
Атрибут на основе
Отличительной особенностью MVC6 является то, что вы также можете определять маршруты для каждого контроллера, декорируя класс Controller
и / или методы Action
соответствующими RouteAttribute
и / или HttpGet
/ HttpPost
параметры шаблона, такие как:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNet.Mvc;
namespace MyNamespace.Controllers
{
[Route("api/[controller]")]
public class ItemsController : Controller
{
// GET: api/items
[HttpGet()]
public IEnumerable<string> Get()
{
return GetLatestItems();
}
// GET: api/items/5
[HttpGet("{num}")]
public IEnumerable<string> Get(int num)
{
return GetLatestItems(5);
}
// GET: api/items/GetLatestItems
[HttpGet("GetLatestItems")]
public IEnumerable<string> GetLatestItems()
{
return GetLatestItems(5);
}
// GET api/items/GetLatestItems/5
[HttpGet("GetLatestItems/{num}")]
public IEnumerable<string> GetLatestItems(int num)
{
return new string[] { "test", "test2" };
}
// POST: /api/items/PostSomething
[HttpPost("PostSomething")]
public IActionResult Post([FromBody]string someData)
{
return Content("OK, got it!");
}
}
}
Этот контроллер будет обрабатывать следующие запросы:
[GET] api/items
[GET] api/items/5
[GET] api/items/GetLatestItems
[GET] api/items/GetLatestItems/5
[POST] api/items/PostSomething
Также обратите внимание, что если вы используете два подхода вместе, маршруты на основе атрибутов (если они определены) будут переопределять маршруты на основе конвенций, и оба они будут переопределять маршруты по умолчанию, определенные UseMvc()
.
Для получения дополнительной информации, вы также можете прочитать следующий пост в моем блоге.