gpt4 book ai didi

api - 使用 Web API 指定 OData 的路由值

转载 作者:行者123 更新时间:2023-12-02 03:36:43 24 4
gpt4 key购买 nike

我正在处理一个新的 OData 项目,并且我第一次尝试使用 Web API 2 来完成它。 OData 提要非常易于安装,与 WCF 相比非常好。

我现在遇到的问题是我的 OData 提要将在“ Multi-Tenancy ”环境中使用,我想根据租户为提要使用“友好”的 URL。因此,理想情况下,我希望提要 URL 看起来像这样:

/store/tenant1/Products
/store/tenant2/Products

两个 URL 都指向同一个 Controller ,最终指向同一个数据集,但我想根据租户强制执行一些实体过滤。显然这会很困难,并且与标准 Web API 路由有些不同,因为我只能指定路由前缀而不能指定路由模板。

到目前为止,我已经修改了我的 OData Controller 以将租户名称作为参数,这在点击以下 url 时效果很好(这不是我想要的,请参见上面的目标):

http://mydomainname/odata/Products?tenantName=test

使用这个路由定义:

ODataConventionModelBuilder modelBuilder = new ODataConventionModelBuilder();
modelBuilder.EntitySet<Product>("Products");
IEdmModel model = modelBuilder.GetEdmModel();
config.Routes.MapODataRoute(routeName: "OData", routePrefix: "odata", model: model);

这是我 Controller 上的示例操作:

[Queryable]
public IQueryable<Product> GetPproducts(string tenantName)
{
return _products.Where(p=>p.TenantName == tenantName);
}

我不太确定这是否可行,我最后的选择是使用 URL 重写规则,但我宁愿避免这种情况,并以正确的方式将所有内容都写在代码中。

非常感谢您的帮助!

最佳答案

经过一些调查,我发现它是这样工作的:只需将路由前缀名称应用于查询,例如:

public class MoviesController : ODataController
{
private MoviesContext _db = new MoviesContext();

public IHttpActionResult Get()
{
var routeName=Request.ODataProperties().RouteName;
ODataRoute odataRoute=Configuration.Routes[routeName] as ODataRoute;
var prefixName = odataRoute.RoutePrefix;
return Ok(_db.Movies.Where(m=>m.Title.StartsWith(prefixName)));
}
// Other methods here
}

注:以上代码基于https://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/OData/v4/中的ODataActionsSample现在 OData v4 已经成为 OASIS 的标准,但 v3 还没有,所以 v4 似乎是一个很好的起点。

关于api - 使用 Web API 指定 OData 的路由值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22915192/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com