一切!
我正在使用OData v4,Web API 2.2和ODataController类。我已经实现了简单的Get方法来返回单行和一组行。当有行可以找到时,一切都很好。但是,如果我更改$ filter或指定不存在的密钥ID,我的应用程序将收到状态代码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);
}
}
}
谢谢!
皮特
答案 0 :(得分: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
答案 1 :(得分: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
- 少GET