2014-10-27 28 views
3

我有一個asp.net web api,使用屬性在控制器上進行路由。在行動層面上沒有任何路線。訪問資源的途徑是:路由參數和多種控制器類型

[Route("{id}"] 
public MyApiController: ApiController 
{ 
    public HttpResponseMessage Get(Guid id) 
    { 
     // ... 
    } 
} 

我的問題是,當我想創建一個搜索控制器,我想的網址是

[Route("search")] 

但是,這將導致一個錯誤: Multiple controller types were found that match the URL。是否有可能確保在通用之前選擇完全匹配的路線?

從技術上講,短語search可能是第一個控制器的有效ID,但由於{id}是一個GUID,所以永遠不會出現這種情況,因此我想選擇具有完全匹配路由的控制器。

+0

你是什麼意思的「默認路線」?你能展示更多的上下文代碼嗎? – DavidG 2014-10-27 09:08:46

+0

對不起。我們正在討論控制器級別的路由。默認路由沒有技術含義,但是它是訪問API主要資源的路由。 – 2014-10-27 09:12:27

+0

那麼在控制器級別擁有'RoutePrefix'會不會更好? – DavidG 2014-10-27 09:40:59

回答

1

您可以使用路徑約束來完成這項工作。例如,你可以限制你的ID路由只接受有效的GUID。

這裏有一個ID控制器只接受在URL字符串GUID:

[System.Web.Http.Route("{id:guid}")] 
public class MyApiController: ApiController 
{ 
    public HttpResponseMessage Get(Guid id) 
    { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 
} 

搜索控制器將匹配到一個URL像"/search"。以下是搜索控制器:

[System.Web.Http.Route("search")] 
public class SearchController : ApiController 
{ 
    public HttpResponseMessage Get() 
    { 
     return new HttpResponseMessage(HttpStatusCode.OK); 
    } 
} 

約束將防止路由器中的匹配衝突。

+0

不錯的解決方案。謝謝! – 2014-10-27 11:17:26

+0

不客氣;) – 2014-10-27 11:17:36