如何在ASP.NET Core 2.0 MVC中为GET和POST请求添加单独的默认路由?
目前,我有我的Startup.cs类以下内容:如何在ASP.NET Core 2.0 MVC中为GET和POST请求添加单独的默认路由?
app.UseMvc(routes =>
{
routes.MapRoute("default", "api/{controller}/{action=Get}");
});
我所有的MVC控制器有一个方法对他们的获取,以及其中一些有一个帖子也是如此。事情是这样的:
public class ExampleController : Controller
{
[HttpGet]
public MyType Get()
{
return GetMyTypeFromSomewhere();
}
[HttpPost("api/[controller]")]
public void Post([FromBody]MyType updated)
{
//do some stuff with the new instance
}
}
目前我需要有("api/[controller]")
对Post方法,使POST请求将达到它。
我希望能够删除这个并将POST请求重定向到默认情况下的控制器Post方法。问题是,如果我在当前状态下这样做,HTTP POST请求将最终发布到/api/Example/Get
。
我已经看过MapGet
和MapPost
,但这些我唯一的实现可以发现管道短路,处理和响应内的RequestDelegate传递。我的控制器方法永远不会达到这种方式。
我该如何做到这一点?
编辑
它可能是值得加入,有些控制器具有在api/controller/action
达到,这意味着我需要有地方指定{action}
路线上他们额外的GET和POST方法。但是这样做意味着我的默认Get和Post方法不再可以通过控制器名称访问,因此在MapRoute中添加=Get
作为默认操作。
当然,每个请求都将使用Get
方法,因为您已经告诉它默认它于:
routes.MapRoute("default", "api/{controller}/{action=Get}");
如果指定的文字段(动作令牌),即/api/example/get
,MVC认为,由于在啄食顺序的最顶层。这就是为什么它总是在你的控制器中选择Get
动作,因为你已经在URL中指定了动作令牌。
不要用web api来做!
取而代之,web api使用HttpVerb
来映射路线。所以你不应该指定HttpVerb
以及Url。您提供HttpVerb
作为方法类型以及请求。
将api路径想象为标识资源/资源集合。它与你对MVC(RPC风格)的看法不同。
改变这些,并给它一个尝试:
Startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseMvcWithDefaultRoute();
}
客户资源
[Route("api/[controller]")]
public class CustomersController : Controller
{
[HttpGet]
public IActionResult Get()
{ ... }
[HttpPost]
public IActionResult Post()
{ ... }
}
我也许应该提到,一些控制器有额外的GET和POST方法上他们,这是无法达成的,除非一种方式访问 /动作*指定的地方。但是,如果我在MapRoute中指定* action *,则不再仅通过控制器名称自动访问Get和Post方法 – benji7425
您尝试删除MapRoute并仅使用默认mvc路由吗? Get和Post方法应该以这种方式访问。现在有关其他 额外的GET和POST方法,有关mvc如何首先选择哪种方法的排序逻辑。也许你应该更新你的文章并发布这些额外的方法。 –