【问题标题】:How can add separate default routes for GET and POST requests in ASP.NET Core 2.0 MVC?如何在 ASP.NET Core 2.0 MVC 中为 GET 和 POST 请求添加单独的默认路由?
【发布时间】:2017-10-11 17:28:15
【问题描述】:

目前我的 Startup.cs 类中有以下内容:

app.UseMvc(routes =>
    {
        routes.MapRoute("default", "api/{controller}/{action=Get}");
    });

我所有的 MVC 控制器都有一个 Get 方法,其中一些也有一个 Post。像这样的:

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
    }
}

目前我需要在 Post 方法上使用 ("api/[controller]") 以便发布请求能够到达它。

我希望能够删除它并将 POST 请求默认重定向到控制器 Post 方法。问题是,如果我在当前状态下这样做,HTTP POST 请求最终将发布到/api/Example/Get

我已经研究了MapGetMapPost,但是我可以找到的唯一实现是在传递的 RequestDelegate 中使管道短路、处理和响应。我的控制器方法永远不会以这种方式到达。

我怎样才能做到这一点?

编辑

这可能值得添加,一些控制器上有额外的 GET 和 POST 方法,可以在 api/controller/action 访问,这意味着我需要在某处指定到 {action} 的路由。然而,这样做意味着我的默认 Get 和 Post 方法不再只能通过控制器名称访问,因此添加 =Get 作为 MapRoute 中的默认操作

【问题讨论】:

    标签: c# asp.net-core asp.net-core-mvc asp.net-core-2.0


    【解决方案1】:

    当然,每个请求都会使用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()
        {   ...   }
    }
    

    【讨论】:

    • 您是否尝试删除 MapRoute 并仅使用默认 mvc 路由? Get 和 Post 方法应该可以通过这种方式访问​​。现在关于其他额外的 GET 和 POST 方法,有一个关于 mvc 如何首先选择哪个方法的排序逻辑。也许你应该更新你的帖子并发布那些额外的方法。
    猜你喜欢
    • 2017-02-01
    • 2017-07-08
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-01
    • 1970-01-01
    • 2021-02-23
    相关资源
    最近更新 更多