使用Web Api我有一個OData EndPoint可以從數據庫返回產品。在OData中傳遞參數WebApi Url
我有多個具有相似模式的數據庫,並且想要在URL中傳遞一個參數來確定Api應該使用哪個數據庫。
當前的OData端點:
http://localhost:62999/Products
我想要什麼:
http://localhost:62999/ /產品
在新網址,我通過999(數據庫ID)。
數據庫ID旨在指定從哪個數據庫加載產品。例如,localhost:62999/999/Products('ABC123')
會從數據庫999加載產品'ABC123',但下一個請求localhost:62999/111/Products('XYZ789')
會從數據庫111加載產品'XYZ789'。
下面的Url工作,但我不喜歡。
localhost:62999/Products('XYZ789')?database=111
這裏是控制器代碼:
public class ProductsController : ErpApiController //extends ODataController, handles disposing of database resources
{
public ProductsController(IErpService erpService) : base(erpService) { }
[EnableQuery(PageSize = 50)]
public IQueryable<ProductDto> Get(ODataQueryOptions<ProductDto> queryOptions)
{
return ErpService.Products(queryOptions);
}
[EnableQuery]
public SingleResult<ProductDto> Get([FromODataUri] string key, ODataQueryOptions<ProductDto> queryOptions)
{
var result = ErpService.Products(queryOptions).Where(p => p.StockCode == key);
return SingleResult.Create(result);
}
}
我使用Ninject解決其IErpService的實施,注入到控制器通過結合服務提供商:
kernel.Bind<IErpService>().ToProvider(new ErpServiceProvider());
和ErpServiceProvider
檢查url以識別此請求所需的databaseId:
public class ErpServiceProvider : Provider<IErpService>
{
protected override IErpService CreateInstance(IContext context)
{
var databaseId = HttpContext.Current.Request["database"];
return new SageErpService(new SageContext(GetDbConnection(databaseId)));
}
}
我堅持的是如何在OData路由配置中定義URL參數。
普通的WebAPI的路線可以有參數,定義如下:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
但是我怎麼定義的OData的路由配置參數?
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<ProductDto>("Products");
builder.EntitySet<WorkOrderDto>("WorkOrders");
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: null,
model: builder.GetEdmModel());
這就是我應該定義Url參數的地方嗎? 我也想過使用消息處理程序,但我不確定如何實現這一點。
UPDATE
這個問題是試圖做同樣的事情,我說:How to declare a parameter as prefix on OData
但目前尚不清楚該參數是如何從URL中讀取。
var databaseId = HttpContext.Current.Request["database"];
當前返回null。
即使更新路由配置以下後:
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "ErpApi",
routeTemplate: "{database}/{controller}"
);
// Web API configuration and services
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<ProductDto>("Products");
builder.EntitySet<WorkOrderDto>("WorkOrders");
config.MapODataServiceRoute(
routeName: "ODataRoute",
routePrefix: "{company}/",
model: builder.GetEdmModel());
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
只是爲了澄清......你是否想用ID來指定哪個單從數據庫中選擇產品,還是從哪個數據庫中選擇所有產品? –
它旨在指定從哪個數據庫加載產品。例如'localhost:62999/999/Products('ABC123')'會從數據庫999加載產品'ABC123',但下一個請求'localhost:62999/111/Products('XYZ789')'會加載產品' XYZ789'來自數據庫111. – philreed
嗨philreed你解決了你的問題嗎?我建議你的問題的解決方案 –