все!OData Web API REST GET, как вернуть 204 или 404 с помощью ODataController
Я использую OData v4, Web API 2.2 и класс ODataController. Я реализовал простые методы Get, чтобы вернуть одну строку и ряд строк. Все работает отлично, когда есть строки, которые можно найти. Но если я изменю $ фильтра или указать идентификатор ключа, который не существует, мое приложение получает код состояния 500.
Вопросы:
Должен ли мой REST службы возврата 204 или 404? Кажется, что 500 - фиктивный.
Я видел примеры с использованием EntitySetController. Но похоже, что последние OData используют System.Web.OData. *, Где пример EntitySetController использует System.Web.Http.OData. * - последний больше не используется? Должен ли я использовать EntitySetController?
Каков наилучший способ для меня изменить мою службу 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);
}
}
}
Спасибо!
Пит
Спасибо, Джон. Я попробую сейчас. Проблема с System.Web.OData и System.Web.Http.OData была решена с помощью NuGet для обновления библиотек. Все ссылки теперь относятся к System.Web.Http.OData. * – Pete
Остерегайтесь, есть два набора пакетов nuget. Один для v3 и один для v4 (v5?). Поддержка javascript для v4 + очень мало, поэтому, если вы хотите использовать BreezeJs или другие, я рекомендую придерживаться v3. У v3 есть EntitySetController, пока его нет с v4. v4 поддерживает AttributeRouting и другие вещи, которые v3 не ... поэтому не забудьте выяснить, какие функции вам нужно увидеть, если вам нужно идти с v3 или последним v4 (5?) – John
@Pete Я обновил свой ответ с дополнительной информацией на v3 vs v4 :) – John