如何在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

我已经看过MapGetMapPost,但这些我唯一的实现可以发现管道短路,处理和响应内的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() 
    { ... } 
} 
+0

我也许应该提到,一些控制器有额外的GET和POST方法上他们,这是无法达成的,除非一种方式访问​​ /动作*指定的地方。但是,如果我在MapRoute中指定* action *,则不再仅通过控制器名称自动访问Get和Post方法 – benji7425

+0

您尝试删除MapRoute并仅使用默认mvc路由吗? Get和Post方法应该以这种方式访问​​。现在有关其他 额外的GET和POST方法,有关mvc如何首先选择哪种方法的排序逻辑。也许你应该更新你的文章并发布这些额外的方法。 –