2014-10-14 3 views
1

все!OData Web API REST GET, как вернуть 204 или 404 с помощью ODataController

Я использую OData v4, Web API 2.2 и класс ODataController. Я реализовал простые методы Get, чтобы вернуть одну строку и ряд строк. Все работает отлично, когда есть строки, которые можно найти. Но если я изменю $ фильтра или указать идентификатор ключа, который не существует, мое приложение получает код состояния 500.

Вопросы:

  1. Должен ли мой REST службы возврата 204 или 404? Кажется, что 500 - фиктивный.

  2. Я видел примеры с использованием EntitySetController. Но похоже, что последние OData используют System.Web.OData. *, Где пример EntitySetController использует System.Web.Http.OData. * - последний больше не используется? Должен ли я использовать EntitySetController?

  3. Каков наилучший способ для меня изменить мою службу OData, чтобы вернуть соответствующий код состояния?

Это мой контроллер.

using ERSHubRest.Models; 

using System.Linq; 
using System.Net; 
using System.Threading.Tasks; 
using System.Web.Http; 

using System.Data.Entity; 
using System.Data.Entity.Infrastructure; 

using System.Web.OData; 
using System.Web.OData.Routing; 
using System.Web.OData.Query; 

using System.Runtime.Serialization; 
using System.Collections.Generic; 
using System.Security.Claims; 
using System.Web.Http; 

namespace ERSHubRest.Controllers 
{ 
    public class AppVersionsController : ODataController 
    { 
     HubModel db = new HubModel(); 

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

     [EnableQuery] 
     public IQueryable<AppVersions> Get() 
     { 
      if (db.AppVersions.Count() <= 0) 
      { 
       throw new HttpResponseException(HttpStatusCode.NotFound); 
      } 

      return db.AppVersions; 
     } 

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

      if (result == null) 
      { 
       throw new HttpResponseException(HttpStatusCode.NotFound); 
      } 

      return SingleResult.Create(result); 
     } 

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

Спасибо!

Пит

ответ

2

Использование IHttpActionResult в качестве возвращаемого типа, а затем вернуть Ok(object(s)) или NotFound(), если не было никаких

OData v3: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.OData/

OData v4: https://www.nuget.org/packages/Microsoft.AspNet.OData/

Убедитесь для ознакомления с последними функциями для каждого. BreezeJs (и другие библиотеки javascript) не обновлены для v4, но вам нужно будет использовать v3.

v3 не имеет таких функций, как AttributeRouting и другие более новые материалы, поэтому вы можете прочитать их различия.

http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api

+0

Спасибо, Джон. Я попробую сейчас. Проблема с System.Web.OData и System.Web.Http.OData была решена с помощью NuGet для обновления библиотек. Все ссылки теперь относятся к System.Web.Http.OData. * – Pete

+0

Остерегайтесь, есть два набора пакетов nuget. Один для v3 и один для v4 (v5?). Поддержка javascript для v4 + очень мало, поэтому, если вы хотите использовать BreezeJs или другие, я рекомендую придерживаться v3. У v3 есть EntitySetController, пока его нет с v4. v4 поддерживает AttributeRouting и другие вещи, которые v3 не ... поэтому не забудьте выяснить, какие функции вам нужно увидеть, если вам нужно идти с v3 или последним v4 (5?) – John

+0

@Pete Я обновил свой ответ с дополнительной информацией на v3 vs v4 :) – John

0

Вместо сравнения result к null, просто возвращают SingleResult:

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

    return SingleResult.Create(result); 
} 

.NET будет заботиться о 404 результата для вас. Вы не можете сравнить результат предложения Where с null, потому что IQueryable не работает таким образом. Он никогда не будет нулевым. Для этого вам нужно будет сделать result.SingleOrDefault(), но тогда вы потеряете IQueryable для функции OData.

Не знаете, почему вы получаете ошибку 500. Возможно, используя явно Count (что, опять же, не нужно), помешает IQueryable, поставив его в неловкое состояние, но это относится только к key -less GET.

Смежные вопросы