【发布时间】:2020-09-06 01:05:20
【问题描述】:
我需要用这个分配创建一个 OData 控制器。
http://xxxxxx/odata/mock/Itens(NumContrato='1234',IdItem='10')/Pedidos
ItensController
public class ItensController : ODataController
{
[HttpPost]
[ODataRoute("(NumContrato={NumContrato},IdItem={IdItem})/Pedidos")]
public IQueryable<Pedido> Pedidos([FromODataUri] string NumContrato, [FromODataUri] string IdItem)
{
... do something
}
}
WebApiConfig.cs
...
config.Routes.MapODataServiceRoute(
"ODataRoute",
"odata/mock",
model: GetModel(),
new DefaultODataBatchHandler(GlobalConfiguration.DefaultServer));
...
public static IEdmModel GetModel()
{
ODataModelBuilder builder = new ODataConventionModelBuilder();
...
builder.EntitySet<Dominio.ODataSapFake.Item>("Itens");
builder.EntitySet<Dominio.ODataSapFake.LinhaDeServico>("LinhasDeServicos");
builder.EntitySet<Dominio.ODataSapFake.Pedido>("Pedidos");
var a = builder.Entity<Dominio.ODataSapFake.Item>().Collection.Action("Pedidos");
a.Parameter<string>("NumContrato");
a.Parameter<string>("IdItem");
a.ReturnsCollectionFromEntitySet<Dominio.ODataSapFake.Pedido>("Pedidos");
...
return builder.GetEdmModel();
}
调用服务时出错。
<m:error xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<m:code/>
<m:message xml:lang="en-US">
No HTTP resource was found that matches the request URI 'http://localhost:4492/odata/mock/Itens(NumContrato='100',IdItem='00040')/Pedidos'.
</m:message>
<m:innererror>
<m:message>No routing convention was found to select an action for the OData path with template '~/entityset/key/navigation'.
</m:message>
<m:type/>
<m:stacktrace/>
</m:innererror>
</m:error>
【问题讨论】:
-
您还应该发布
Item的结构,这样可以更快地解决问题:) -
我同意,但它是一个巨大的类,不知道自定义路由。顺便说一句,这就是我解决问题的方法。 :)
-
酷,我看到你现在已经添加了那个标签,你应该发布你的解决方案作为答案,你是使用属性表示法还是
CustomRouteConvention。文档在自定义路由docs.microsoft.com/en-us/odata/webapi/routing-abstract 上非常好 -
当你的类很大时,你只需要包含主要元素,比如类名、关键属性和你在问题中引用的任何其他属性,比如过滤器或在这种情况下
Pedidos。只需添加一个省略号 ... 来表示省略的代码行。听起来我很迂腐,但经常通过写一个好问题的过程来帮助你解决问题,你仍然可以发布它,你可以发布你的解决方案,你仍然会发表评论。 -
当然不是!我需要多参与,多写……练习!
标签: c# api odata custom-routing