【问题标题】:OData Web API REST GET how to return 204 or 404 using ODataControllerOData Web API REST GET 如何使用 ODataController 返回 204 或 404
【发布时间】:2014-12-09 12:20:52
【问题描述】:

全部!

我正在使用 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 服务以返回适当的状态代码的最佳方法是什么?

这是我的控制器。

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);
        }
    }
}

谢谢!

皮特

【问题讨论】:

    标签: .net odata


    【解决方案1】:

    使用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

    【讨论】:

    • 谢谢,约翰。我现在就试试。通过使用 NuGet 更新库解决了 System.Web.OData 与 System.Web.Http.OData 的问题。现在所有的引用都指向 System.Web.Http.OData.*
    • 注意,有两组nuget包。一个用于 v3,一个用于 v4(v5?)。 v4+ 对 javascript 的支持很少,所以如果你想使用 BreezeJs 或其他我建议坚持使用 v3。 v3 确实有 EntitySetController 而它与 v4 一起消失了。 v4 支持 AttributeRouting 和其他 v3 不支持的东西......所以请务必弄清楚您需要哪些功能,看看您是否需要使用 v3 或最新的 v4(5?)
    • @Pete 我用关于 v3 和 v4 的更多信息更新了我的答案 :)
    • 谢谢!我要疯了,试图把这些东西理顺。似乎它应该比这更容易!我坚持使用 v4,但尝试使用最新最好的版本似乎总是很痛苦。
    • @Pete 我完全同意......我们最终没有使用 OData,而只是使用常规的 ApiControllers,因为它最终令人头疼:(
    【解决方案2】:

    不要将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() 才能使其工作,但是您将失去 IQueryableOData 功能。

    不确定为什么会收到 500 错误。也许显式使用Count(这也是不必要的)通过将IQueryable置于尴尬状态而将其搞乱,但这仅占key-less GET的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 2016-06-14
      • 2014-11-22
      • 2014-10-18
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多