OData Web API REST GET如何使用ODataController返回204或404

时间:2014-10-14 16:08:43

标签: .net odata

一切!

我正在使用OData v4,Web API 2.2和ODataController类。我已经实现了简单的Get方法来返回单行和一组行。当有行可以找到时,一切都很好。但是,如果我更改$ filter或指定不存在的密钥ID,我的应用程序将收到状态代码500。

问题:

  1. 我的REST服务应该返回204还是404?好像500就是虚假。

  2. 我见过使用EntitySetController的例子。但似乎最新的OData正在使用System.Web.OData。*,其中EntitySetController示例使用System.Web.Http.OData。* - 后者不再使用?我应该不使用EntitySetController吗?

  3. 修改OData服务以返回相应状态代码的最佳方法是什么?

  4. 这是我的控制器。

    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 个答案:

答案 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)

不要将resultnull进行比较,只需返回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