ASP.NET Web API OData V4 Служба возврата HTTP 404 ($ top) - PullRequest
0 голосов
/ 02 декабря 2018

Я пытаюсь создать службу OData с использованием C # (VS 2017, .Net 4.6.1) и не может заставить работать параметры строки запроса OData.Вызов для возврата группы или отдельного MusicItem работает, но когда я добавляю $ top = 2, я получаю ответ HTTP 404.Я исследовал это в сети в течение двух дней, но не могу найти ответ.

Мысли?

WebApiConfig выглядит следующим образом:

using md.music.services.Models;
using Microsoft.AspNet.OData.Builder;
using Microsoft.AspNet.OData.Extensions;
using Microsoft.OData.Edm;
using System.Web.Http;

namespace md.music.services
{
    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            config.MapHttpAttributeRoutes();

            config.MapODataServiceRoute("ODataRoute", "odata", GetImplicitEDM());

        }

        public static IEdmModel GetImplicitEDM()
        {
            ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

            builder.EntitySet<MusicItem>("MusicItems");

            return builder.GetEdmModel();

        }

    }

}

Контроллер MusicItems выглядит следующим образом:

using md.music.services.Models;
using Microsoft.AspNet.OData;
using Microsoft.AspNet.OData.Query;
using System.Linq;
using System.Web.Http;

namespace md.music.services.Controllers
{
    public class MusicItemsController : ODataController
    {
        WA0002Entities entities = new WA0002Entities();

        [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
        public IQueryable<MusicItem> Get(ODataQueryOptions opts)
        {
            return entities.MusicItems.AsQueryable<);

        }

        [EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All)]
        public MusicItem Get([FromODataUri] int key)
        {
            MusicItem thisObject = entities.MusicItems.FirstOrDefault(c => c.RowID == key);

            if (thisObject == null)
            {
                throw new HttpResponseException(System.Net.HttpStatusCode.NotFound);

            }

            return thisObject;

        }

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

            entities.Dispose();

        }

    }

}

1 Ответ

0 голосов
/ 03 декабря 2018

То, что вы получаете ошибку 404, возможно, связано с тем, что вы не добавили $ top в качестве параметра запроса в URL.Вам нужно добавить все ваши запросы odata после ?

URL-адрес должен выглядеть примерно так: http://example.com?$top=2

Кроме того, я думаю, вам нужно указать значение длямаксимальная вершина, которую пользователь может запросить, в противном случае это будет 0 по умолчанию, и вы получите сообщение об ошибке вроде:

"Запрос, указанный в URI, недопустим. Предел '0'for Top query был превышен. Значение из входящего запроса' 2 '. ",

[EnableQuery(AllowedQueryOptions = AllowedQueryOptions.All, MaxTop = 10)]

Обновление:

Вы также будетенеобходимо включить подкачку в объекте, выполнив:

public static IEdmModel GetImplicitEDM()
    {
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();

        builder
            .EntitySet<MusicItem>("MusicItems")
            .Page();

        return builder.GetEdmModel();

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...