繁体   English   中英

如何在ASP.NET Core 2.0 MVC中为GET和POST请求添加单独的默认路由?

[英]How can add separate default routes for GET and POST requests in ASP.NET Core 2.0 MVC?

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

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

我的所有MVC控制器都有一个方法Get on them,其中一些也有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中传递。 我的控制器方法永远不会达到这种方式。

我怎样才能做到这一点?

编辑

它可能值得添加,一些控制器在api/controller/action上有额外的GET和POST方法,这意味着我需要在某处指定{action}的路由。 但是这样做意味着我的默认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()
    {   ...   }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM