2014-10-16 74 views
2

all!我正在使用OData v4構建REST服務。我的表有一個GUID主鍵。使用GUID主鍵的OData V4 REST

我的GET和POST請求工作正常。但是,PUT,PATCH和DELETE請求會以404失敗。

我不確定url應該是什麼樣子。我已經在提琴手中嘗試過這些,所有404都得到了。我已經用相當多的搜索引擎來搜索這些東西,但沒有運氣。

http://localhost/ershubrest/AppVersions/guid'00000000-e90f-4938-b8f6-000000000000' 

http://localhost/ershubrest/AppVersions/'00000000-e90f-4938-b8f6-000000000000' 

http://localhost/ershubrest/AppVersions/00000000-e90f-4938-b8f6-000000000000 

這裏是我的控制器代碼...

using ERSHubRest.Models; 
using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 
using System.Linq; 
using System.Net; 
using System.Threading.Tasks; 
using System.Web.Http; 
using System.Web.OData; 
using System.Web.OData.Query; 
using System.Web.OData.Routing; 

namespace ERSHubRest.controllers 
{ 
[ODataRoutePrefix("AppVersions")] 
public class AppVersionsController : ODataController 
{ 
    HubModel db = new HubModel(); 

    private bool AppVersionsExists(System.Guid key) 
    { 
     return db.AppVersions.Any(p => p.AppVersionId == key); 
    } 

    // http GET for select queries 

    [ODataRoute] 
    [EnableQuery] 
    public IQueryable<AppVersions> Get() 
    { 
     return db.AppVersions; 
    } 

    [ODataRoute("({key})")] 
    [EnableQuery] 
    public IHttpActionResult Get([FromODataUri] System.Guid key) 
    { 
     IQueryable<AppVersions> result = db.AppVersions.Where(p => p.BusinessId == key); 

     if (result == null) 
     { 
      return NotFound(); 
     } 

     return Ok(result); 
    } 

    // http POST for insert 

    [ODataRoute()] 
    [HttpPost] 
    [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)] 
    public async Task<IHttpActionResult> Post(AppVersions appVersions) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 
     db.AppVersions.Add(appVersions); 
     await db.SaveChangesAsync(); 
     return Created(appVersions); 
    } 

    // http PUT and PATCH for updates 

    [ODataRoute()] 
    [HttpPatch] 
    [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)] 
    public async Task<IHttpActionResult> Patch([FromODataUri] System.Guid key, Delta<AppVersions> appVersions) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 
     var entity = await db.AppVersions.FindAsync(key); 
     if (entity == null) 
     { 
      return NotFound(); 
     } 
     appVersions.Patch(entity); 
     try 
     { 
      await db.SaveChangesAsync(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (!AppVersionsExists(key)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 
     return Updated(entity); 
    } 

    [ODataRoute()] 
    [HttpPut] 
    [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)] 
    public async Task<IHttpActionResult> Put([FromODataUri] System.Guid key, AppVersions update) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 
     if (! key.Equals(update.BusinessId)) 
     { 
      return BadRequest(); 
     } 
     if (!AppVersionsExists(key)) 
     { 
      return BadRequest(); 
     } 
     db.Entry(update).State = EntityState.Modified; 
     try 
     { 
      await db.SaveChangesAsync(); 
     } 
     catch (DbUpdateConcurrencyException) 
     { 
      if (! AppVersionsExists(key)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw; 
      } 
     } 
     return Updated(update); 
    } 

    // last is Delete 

    [ODataRoute()] 
    [HttpDelete] 
    [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)] 
    public async Task<IHttpActionResult> Delete([FromODataUri] System.Guid key) 
    { 
     var appVersions = await db.AppVersions.FindAsync(key); 
     if (appVersions == null) 
     { 
      return NotFound(); 
     } 
     db.AppVersions.Remove(appVersions); 
     await db.SaveChangesAsync(); 
     return StatusCode(HttpStatusCode.NoContent); 
    } 

    // clean up 

    protected override void Dispose(bool disposing) 
    { 
     db.Dispose(); 
     base.Dispose(disposing); 
    } 
} 
} 

回答

4

的PATCH請求的URL,PUT和DELETE應該是:

http://localhost/ershubrest/AppVersions(00000000-e90f-4938-b8f6-000000000000) 

的OData使用parenthesizes解決單使用密鑰的實體。

更多URL公約,OData的V4 URL約定規範可以被稱爲:http://docs.oasis-open.org/odata/odata/v4.0/os/part2-url-conventions/odata-v4.0-os-part2-url-conventions.html

+0

我試過這些沒有成功。我認爲我必須在我的控制器或webapi.config路由中出現錯誤。 http:// localhost/ershubrest/AppVersions('00000000-E90F-4938-B8F6-000000000000')和http:// localhost/ershubrest/AppVersions(guid'00000000-E90F-4938-B8F6-000000000000') - 結果是404.我將嘗試一下控制器和webapi.config,看看我能否找到這個bug。至少我知道我正在使用正確的語法。謝謝! – Pete 2014-10-20 15:26:52

+0

@Pete對不起,我犯了一個錯誤。如果密鑰類型是GUID,則不需要單引號。我糾正了我的答案。如果你發現答案是有用的,你可以接受它或將其標記爲有用:) – 2014-10-21 11:27:21

+0

我必須補充說你的實體也應該有Guid鍵。換句話說,在將密鑰存儲爲字符串時,您不能接受Guid。 – 2015-05-19 10:19:45

4

試試這個: http://localhost/ershubrest/AppVersions(guid '00000000-e90f-4938-b8f6-000000000000')

這應該工作! !

+0

果然,這是爲我修復的。不知道什麼時候會改變(可能是因爲我們現在使用.net 4.5)。但是沒有任何工作,直到我嘗試過。 – ebol2000 2015-07-09 00:05:00

+0

這是正確的答案。 – 2015-11-24 13:48:48