2017-03-31 108 views
1

我正在使用asp.net核心創建web api。該API終點邏輯映射到資源的關係基於guidelines here 所以我的API看起來路由不適用於網頁api與實現

 http://tax.mydomain.com/api/v1/clients/1/batches/12/start 

ClientBatch父,1是的clientid和12是batchid和Start是POST操作方法。

這裏是相應的控制器

public class TaxController : Controller 
{ 
    [HttpPost] 
    [Route("clients/{clientid}/batches/{batchid}/start")] 
    public void Start([FromRoute]string clientId, [FromRoute]string batchId, 
         [FromBody]IEnumerable<string> urls) 
    { 
     // do something 
    } 
} 

因爲api/v1是共同的所有控制器我配置,在啓動時的Configure方法。另外我想Home作爲默認控制器。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     app.UseMvc(routes => 
     { 
     routes.MapRoute("default","api/v1/{controller=Home}/{action=Index}/{id?}"); 
     }); 
    } 

但是客戶也越來越沒有發現錯誤API http://tax.mydomain.com/api/v1/clients/1/batches/12/start

+0

打開'[路線( 「客戶端/ {的clientid} /批次/ {batchid} /啓動」)]'入'[ Route(「api/v1/clients/{clientid}/batch/{batchid}/start」)]' –

回答

1

沒有基於公約路由屬性路由使用任何控制器的方法。

當您使用[Route]屬性時,您將定義屬性路由,因此常規路由不會用於該操作/控制器。因此,您的控制器是

http://tax.mydomain.com/clients/1/batches/12/start 

作爲一個選項訪問,你可以用這樣的事實,即屬性的路由可以與繼承相結合。整個控制器上設置的Route屬性,這將作爲路由前綴(在相同的行爲的WebAPI [RoutePrefix]屬性):

[Route("api/v1")] 
public class TaxController : Controller 
{ 

} 

更普遍的例子來自routing文檔:

[Route("api/[controller]")] 
public abstract class MyBaseController : Controller { ... } 

public class ProductsController : MyBaseController 
{ 
    [HttpGet] // Matches '/api/Products' 
    public IActionResult List() { ... } 

    [HttpPost("{id}")] // Matches '/api/Products/{id}' 
    public IActionResult Edit(int id) { ... } 
} 
+0

是否需要在控制器級設置路由前綴?我們可以在startup.cs中設置它嗎?如果是的話如何? – LP13

+0

@ LP13僅限於控制器級別。屬性路由是關於特定控制器中的特定操作。否則,您將轉向基於約定的路由。 – Set

0

有兩種事情不對您的設置

  1. 你叫http://tax.mydomain.com/clients/1/batches/12/start但你沒有在它指定的控制器名稱。該路線尋找名爲ClientsController的控制器。所以正確的網址必須是http://tax.mydomain.com/tax/clients/1/batches/12/start而不是
  2. 您似乎使用默認的MVC/Viewbased路線,但您的網址建議您使用WebAPI。

    當您使用WebAPI創建Rest服務時,您沒有任何操作。相反,動作映射到Http Verbs(GET(讀取),PUT(更新/替換),POST(插入),DELETE)。

    所以對於REST服務的默認路由應該是這樣的,而不是:api/v1/{controller=Home}/{id?}

+0

好吧,我不想在網址中再次徵稅,因爲它已經是子域的一部分。我將控制器名稱更改爲「客戶端」,但這並沒有幫助 – LP13

+0

如果您要創建剩餘服務(WebAPI),則不必定義操作,因爲http動詞定義了它們。你必須從你的默認路由中刪除動作,就像在第2節中一樣,然後調用你的控制器「ClientsController」或者將調用URL改爲http://tax.mydomain.com/tax/1/batches/12/ start' – Tseng