標籤:命名 ted route 首碼 路由配置 nbsp oda explorer sys
路由配置
routePrefix路由首碼,必須含有Odata字串,否則路由不到Odata控制器。
V1表示版本,可以使用這種方式進資料列版本設定,也可以使用其他方式。
config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);這樣配置使Odata操作符可用(Web Api2的舊版本不必如此設定)。
public static class WebApiConfig{ public static void Register(HttpConfiguration config) { //odata路由 config.MapODataServiceRoute( routeName: "V1OdataRouteVersioning", routePrefix: "Odata/V1", model: GetEdmModel()); config.Count().Filter().OrderBy().Expand().Select().MaxTop(null); config.AddODataQueryFilter(); }}
EDM模型配置
實體名稱為Collection,控制器名稱為CollectionsV1Controller,Action名稱為AddCollection,collectionBM為方法參數名稱。Function名稱為GetCollection,Function返回資料類型為CollectionDTO,Function參數名為userId。使用ODataConventionModelBuilder.Namespace定義命名空間,他是請求URI的一部分。
public class CollectionsV1Controller : ODataController { [EnableQuery] [HttpGet] public List<CollectionDTO> GetCollection(int userId) { return CollectionBLL.GetCollection(userId); } [HttpPost] public int AddCollection(CollectionBindingModel collectionBM) { return CollectionBLL.AddCollection(collectionBM); }}private static IEdmModel GetEdmModel(){ ODataConventionModelBuilder builder = new ODataConventionModelBuilder(); var collectionSet = builder.EntitySet<Collection>("Collections").EntityType.Collection; var getCollectionFunction = collectionSet.Function("GetCollection").Returns<CollectionDTO>(); getCollectionFunction.Parameter<int>("userId"); collectionSet.Action("AddCollection").Returns<int>().Parameter<CollectionBindingModel>("collectionBM"); var deleteCollectionFunction = collectionSet.Function("DeleteCollection").Returns<int>(); deleteCollectionFunction.Parameter<int>("collectionUserId"); builder.Namespace = "Service"; return builder.GetEdmModel();}
控制器與控制器方法
控制器繼承自ODataController,ODataController上有[ApiExplorerSettings(IgnoreApi = true)]
,[ODataFormatting],[ODataRouting]這三個特性,由於[ApiExplorerSettings(IgnoreApi = true)]
的影響,在System.Web.Http.Description.ApiDescription執行個體中不包含繼承自ODataController的控制器;控制器方法使用了[EnableQuery]修飾後才可支援Odata操作符。
自訂方法的方式有兩種,使用EntityCollectionConfiguration<TEntityType>.Action或EntityCollectionConfiguration<TEntityType>.Function。
使用EntityCollectionConfiguration<TEntityType>.Action定義的控制器方法可以通過body體傳參;
使用EntityCollectionConfiguration<TEntityType>.Function定義的控制器方法可以通過url傳參,但url寫法值得注意,例如:http://localhost/HY_WebApi/Odata/V1/Collections/Service.GetCollection(userId=3),注意這裡使用了括弧將參數括起來,而不是“?userId=3”這種格式
使用Action,不支援HttpGet方式,僅支援HttpPost方式。
Function僅支援HttpGet方式,不支援HttpPost方式。
asp.net web api 使用Odata