2016-01-08 49 views
2

我想這篇文章在這裏描述的解決方案: Original articleODATA沒有元數據操作不工作

如上所述我所做的:

var defaultConventions = ODataRoutingConventions.CreateDefault(); 
var conventions = defaultConventions.Except(
     defaultConventions.OfType<MetadataRoutingConvention>()); 
config.MapODataServiceRoute(
     routeName: "ODataRoute", 
     routePrefix: null, 
     model: model, 
     pathHandler: new DefaultODataPathHandler(), 
     routingConventions: conventions); 

一切工作正常,沒有更多的元數據信息。標準的請求工作好了,但未綁定的動作和功能不再工作,我得到了404響應。

我註冊的行爲像OData的模型構造器:

var validateEmailAction = builder.Action("ValidateEmail"); 
     validateEmailAction.Parameter<string>("Email"); 

而且在控制我有:

[HttpPost] 
[ODataRoute("ValidateEmail")] 
public async Task<IHttpActionResult> ValidateEmail(ODataActionParameters parameters) 
{ 
} 

任何建議,我怎麼能達到隱藏Odatametada但仍然有動作/功能的工作?

+0

您是否錯過了url中的命名空間或忘記打開EnableUnqualifiedNameCall? –

回答

3

ODataRoutingConventions.CreateDefault()

將創建路由公約的清單屬性的路由。

雖然未綁定的動作和函數需要屬性路由。

因此,您必須更改來電:

ODataRoutingConventions.CreateDefaultWithAttributeRouting(); 
+0

謝謝。有效。 –

0

如上面提到的,它的工作原理是使用帶屬性的路由默認值,但它也需要配置和EDM模型屬性。

var edmModel = builder.GetEdmModel(); 
var defaultConventions =ODataRoutingConventions.CreateDefaultWithAttributeRouting(config,edmModel); 
var conventions = defaultConventions.Except(defaultConventions.OfType<MetadataRoutingConvention>()); 
     var route = config.MapODataServiceRoute(
      "odata", 
      null, 
      edmModel, 
      pathHandler: new DefaultODataPathHandler(), 
      routingConventions: conventions);