2017-03-12 90 views
1

我很新,在MVC中設置路由和路由。在我上一份工作中,我們使用了屬性路由來完成WebAPI的工作,所以我非常熟悉(RoutePrefixRouteHttpGet/HttpPost屬性等)。而且我可以讓我當前的項目在屬性上正常工作。使用路由前綴混合WebAPI和MVC AttributeRouting?

所以現在我想要做的就是用「api」「前綴」所有webApi路由。所以不要去mysite/test/hello,我想去mysite/api/test/hello。

這是我有什麼,只使用屬性的路由,它工作得很好:

[RoutePrefix("Test")] 
public class TestController : ApiController 
{ .... 

    [HttpPost] 
    [Route("{message}")] 
    public HttpResponse EchoBack(string message) 
    { 
     // return message ... in this case, "hello" 
    } 
} 

現在,我知道我可以改變RoutePrefix到「API /測試」(工作100%),但我不想更改所有的控制器,我寧願能夠通過更改WebApiConfig中傳入的值config.Routes.MapHttpRoute來執行此操作。

這可能嗎?

+0

您所描述的是基於約定的路由,它不能與同一控制器上的屬性路由很好地混合。控制器符合基於約定的路由或屬性路由。不是都。你可以有不同的控制器或者全部屬性或者所有基於約定的控制器屬性路由通過IMO可以提供更多的靈活性。 https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2 – Nkosi

+0

謝謝@Nkosi。所以你說的是,如果我想改變我的基於屬性的控制器以「api」作爲前綴,我應該在每個控制器的RoutePrefix屬性中做,並忽略約定/映射? (今晚我會閱讀MSDN文章,感謝您的發現!!) –

+0

不在每個控制器上。我發現了一篇更好的文章,應該是你正在尋找的東西。http://www.strathweb.com/2015/10/global-route-prefixes-with-attribute-routing-in-asp-net-web-api / – Nkosi

回答

1

您所描述的內容可以通過使用被稱爲全局路由前綴的屬性路由來完成。

引用本文Global route prefixes with attribute routing in ASP.NET Web API

創建DirectRouteProvider

public class CentralizedPrefixProvider : DefaultDirectRouteProvider { 
    private readonly string _centralizedPrefix; 

    public CentralizedPrefixProvider(string centralizedPrefix) { 
     _centralizedPrefix = centralizedPrefix; 
    } 

    protected override string GetRoutePrefix(HttpControllerDescriptor controllerDescriptor) { 
     var existingPrefix = base.GetRoutePrefix(controllerDescriptor); 
     if (existingPrefix == null) return _centralizedPrefix; 

     return string.Format("{0}/{1}", _centralizedPrefix, existingPrefix); 
    } 
} 

引述的文章。

上面所示的CentralizedPrefixProvider,需要被 全局預置到每條路由的前綴。如果一個特定的控制器有 自己的路由前綴(通過base.GetRoutePrefix方法 調用獲得),那麼集中前綴也簡單地作爲 的前綴。

,將其配置在WebAPiConfig這樣

config.MapHttpAttributeRoutes(new CentralizedPrefixProvider("api")); 

所以現在,例如,如果你有這樣的

[RoutePrefix("Test")] 
public class TestController : ApiController { 
    [HttpPost] 
    [Route("{message}")] 
    public IHttpActionResult EchoBack(string message) { ... } 
} 

控制器的上述動作將通過

<<host>>/api/Test/{message} 
訪問

其中api wi將被添加到控制器動作路由。