2014-09-10 101 views
3

我對OData端點使用OData屬性路由。這裏是什麼,我有一個例子:

[ODataRoutePrefix("Profile")] 
public class ProfileODataController : ODataController 
{ 
    [ODataRoute] 
    [EnableQuery] 
    public IHttpActionResult Get() 
    { 
     var repo = new Repositories.ProfileRepository(); 

     return Ok(repo.GetProfiles()); 
    } 

    [ODataRoute("({key})")] 
    [EnableQuery] 
    public IHttpActionResult Get([FromODataUri] string key) 
    { 
     var repo = new Repositories.ProfileRepository(); 

     var result = repo.GetProfiles().SingleOrDefault(x => x.Id== key); 
     if (result == null) return NotFound(); 

     return Ok(result); 
    } 
} 

這裏是我的設置:

config.MapODataServiceRoute("odata", "odata", ModelGenerator.GetEdmModel()); 

這裏是我的EdmModel代:

public static IEdmModel GenerateEdmModel() 
{ 
    var builder = new ODataConventionModelBuilder(); 

    builder.EntitySet<Profile>("Profile").EntityType.HasKey(x => x.Id); 

    return builder.GetEdmModel(); 
} 

的URL /odata/Profile/odata/Profile('someid')都工作,但是當我嘗試訪問$元數據端點(/odata/$metadata#Profile)時,出現以下錯誤:

{"Message":"No HTTP resource was found that matches the request URI 'http://****/odata/$metadata'.","MessageDetail":"No type was found that matches the controller named 'Metadata'."}

是否需要創建一個控制器/操作用於提供元數據?如果是這樣,該行動如何實施?

+0

你可以發表你的'ModelGeneratlr.GetEdmModel()'嗎? – Blaise 2014-09-12 14:32:11

+0

@Blaise發表。 – 2014-09-12 17:23:09

+0

你的代碼沒有什麼特別的。不需要額外的操作來提供元數據。您應該可以使用'.../odata /?$ metadata'和'.../odata/$ metadata'查看元數據。 – Blaise 2014-09-12 19:47:42

回答

5

原來,這與我對IAssembliesResolver的更換有關。

我已經實現了一個定製版本,只提供組件,我已經在實施控制器組件。但是,作爲錯誤說,它不能找到一個名爲MetadataController控制器。原來,OData實現了一個:System.Web.OData.MetadataController,它提供了$metadata關鍵字。

由於我已經實施了我自己的IAssembliesResolver,因此System.Web.OData組件未包含在內,並且$metadata失敗。一旦我發現了這一點,並更新了我的程序集解析器以明確包含OData程序集,它現在可以正常工作。

+0

有完全相同的問題,感謝有識之士娜塔 – 2016-03-30 12:18:18