2017-10-11 34 views
4

目前,我有我的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作爲默認操作。

回答

3

當然,每個請求都將使用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如何首先選擇哪種方法的排序邏輯。也許你應該更新你的文章併發布這些額外的方法。 –