在WebApi中使用普通的ApiController,我制作了以下代码来为每个ApiControllers定义动态地图路径模板:
config.Routes.MapHttpRoute(
name: "Sample",
routeTemplate: "{sessionId}/{controller}"
);
我希望为每个ODataController实现类似的行为。 我已经尝试了以下代码,但它不起作用:
config.MapODataServiceRoute(
routeName: "HSODataRoute",
routePrefix: "{sessionId}/",
model: GetEdmModel());
知道如何在OData中进行此操作吗?我有点新手,互联网上缺乏相关信息。
更具体地说:{sessionId}不应该是常量,而是具有Guid值的参数。
答案 0 :(得分:1)
ODataConventionModelBuilder默认将路由/{controller}
映射到名称为{controller}Controller
的控制器。例如。只要/Products
派生自ProductsController
,它就会自动将ProductsController
路由到ODataController
。
如果您想要更多灵活性,还可以使用路由属性。 E.g。
[ODataRoutePrefix("Products")]
public class Products : ODataController
答案 1 :(得分:1)
您的以下代码应该有效:
config.MapODataServiceRoute(
routeName: "HSODataRoute",
routePrefix: "{sessionId}/",
model: GetEdmModel());
但是,您应该确保请求Uri包含只有一个" /"。 例如:
我发送一个Get请求:
http://localhost/{sessionId}/Customers/Default.PrintDate(date=2014-10-24T01:02:03+08:00)
我的回答是:
{
"@odata.context":"http://localhost/%7BsessionId%7D/$metadata#Edm.String",
"value":"10/24/2014 1:02:03 AM +08:00"
}
其中,PrintDate
是自定义函数绑定到客户集合。
[HttpGet]
public string PrintDate(DateTimeOffset date)
{
return date.ToString();
}
答案 2 :(得分:1)
经过几次测试后,我发现声明MapODataServiceRoute是不够的! 你还需要添加MapHttpRoute,因为ODataController派生自ApiController
config.Routes.MapHttpRoute(
name: "Sample",
routeTemplate: "{sessionId}/{controller}"
);
config.MapODataServiceRoute(
routeName: "HSODataRoute",
routePrefix: "{sessionId}/",
model: GetEdmModel());
我发现这是因为在我删除MapHttpRoute之后,我开始找不到404,当我添加MapHttpRoute时,可以找到资源。
<强>更新强>
我已经找到了解决此问题的最终解决方案:Pass Parameters in OData WebApi Url。