2017-10-19 284 views
1

我在我的OData控制器定義POST方法:上操作的路徑模板不是有效的OData路徑模板

[HttpPost] 
    [ODataRoute("Users/BulkUserUpdate/")] 
    public HttpResponseMessage BulkUserUpdate([FromBody] BulkUserUpdateModel bulkModel) 
    { 
     try 
     { 
      foreach (Guid userId in bulkModel.UserIds) 
      { 
       ... 
      } 
      ... 
      return Request.CreateResponse(HttpStatusCode.OK); 
     } 
     catch (Exception e) 
     { 
      ... 
      return Request.CreateResponse(HttpStatusCode.BadRequest); 
     } 
    } 

當啓動應用程序,我得到錯誤:路徑模板「用戶/ BulkUserUpdate /」上控制器'Users'中的操作'BulkUserUpdate'不是有效的OData路徑模板。錯誤的請求 - 查詢語法錯誤。

我的配置在EntityDataModel:

var userType = builder.EntitySet<UserModel>("Users").EntityType; 
ActionConfiguration bulkUserUpdate = userType.Action("BulkUserUpdate"); 

回答

1

OjamaYellow

按照OData Spec,它說:

要調用綁定到資源的作用,客戶端發出一個POST請求的動作URL。可以從先前返回的實體表示獲得動作URL,或者通過將名稱空間或別名限定的動作名稱追加到URL來標識與其類型與綁定類型相同或源自綁定類型的資源行動的參數。

所以,你[ODataRoute("Users/BulkUserUpdate/")]有兩個問題:

  1. 你應該使用命名空間限定動作名字來稱呼行動。例如:~.. /YourNameSapce.BulkUserUpdate

  2. 您的操作必須爲非收集類型,因此您應該對非收集操作進行調用。

所以,正確的屬性路由字符串應該是:

[ODataRoute(Users({myKey})/YourNamespace.BulkUserUpdate")] 

和你的控制器方法應該有一個說法在接受「的myKey」。

public HttpResponseMessage BulkUserUpdate([FromODataUri]string myKey, [FromBody] BulkUserUpdateModel bulkModel) 

=========================更新10/20/2017 ============ ===從OjamaYellow

響應:

但如果我不想在我的網址的關鍵。所以,其實我是想有未綁定的動作

未綁定的動作,你可以直接調用從「製造商」,「行動」的方法,例如:

ActionConfiguration actionConfig = builder.Action("xxx");

結合的作用是通過行動進口稱爲,按照OData Spec說:

要通過操作導入調用操作,客戶端發出POST請求到標識操作導入的URL。操作導入的規範URL是服務根目錄,後跟操作導入的名稱

所以,正確的屬性路由字符串未綁定的動作應該是:

[ODataRoute("yourActionImportName")]

=============更新2017年10月24日==== =====

如果你想使用Users/BulkUserUpdate,那就是綁定到實體集合的行爲。

所以,在模型構造器,你應該叫:

var userType = builder.EntitySet<UserModel>("Users").EntityType; 
ActionConfiguration bulkUserUpdate = userType.Collection.Action("BulkUserUpdate"); 

請注意userType後 「收集」 的號召。

此外,請更改控制器中的[ODataRoute(「...」)]。 希望它可以幫助。

+0

但如果我不想在我的網址中輸入密鑰會怎麼樣。所以我實際上想要進行無約束的操作 – OjamaYellow

+0

請參閱2017年10月10日的更新 –

+0

這種方式可行,但前提是路由是BulkUserUpdate,但不是如果我擁有我想要的Users/BulkUserUpdate – OjamaYellow