Не зарегистрирован маршрут маршрута без OData HTTP

Я выполнил этот урок, чтобы создать службу RAP WebAPI.

После этого я могу загрузить список всех контактов, указав http://baseaddress/api/Contacts.

Затем я добавил следующий код в методе Register в WebApiConfig.cs, чтобы включить конечную точку OData:

config.Count().Filter().OrderBy().Expand().Select().MaxTop(null);

ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Contact>("Contacts");
config.MapODataServiceRoute(
    routeName: "OData",
    routePrefix: "odata",
    model: builder.GetEdmModel());

Также добавлен параметр [EnableQuery] в Contact.GetContacts(). Таким образом, я могу запросить конкретные контакты следующим образом:

http://baseaddress/odata/Contacts?$filter=startswith(Name,'A')

и это работает как шарм.

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

No non-OData HTTP route registered.

in System.Web.OData.Extensions.HttpConfigurationExtensions.GetNonODataRootContainer(HttpConfiguration configuration)
in System.Web.OData.Extensions.HttpRequestMessageExtensions.GetRootContainer(HttpRequestMessage request, String routeName)
in System.Web.OData.Extensions.HttpRequestMessageExtensions.CreateRequestScope(HttpRequestMessage request, String routeName)
in System.Web.OData.Extensions.HttpRequestMessageExtensions.CreateRequestContainer(HttpRequestMessage request, String routeName)
...

Что мне делать, чтобы это исправить?

Ответ 1

Я столкнулся с этой проблемой, и поскольку я работаю с инъекциями зависимостей, мне удалось решить эту проблему, добавив GlobalConfiguration.Configuration.EnableDependencyInjection() в мой startup.cs

ех.

using System.Web.OData.Extensions;
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        GlobalConfiguration.Configuration.EnableDependencyInjection();
    }
}

Ответ 2

Я столкнулся с этой проблемой до и после добавления строки ниже она работала для меня

protected void Application_Start()
            {  
         GlobalConfiguration.Configuration.EnableDependencyInjection();
             ....  }

Ответ 3

В моем случае, я получил вышеупомянутую ошибку, хотя у меня был отдельный проект, который вообще не имел кода Odata. Так что это было очень странное сообщение.

Моим решением было удалить все пакеты из папки packages. После этого он снова работал. Некоторые пакеты Odata все еще находились в этой папке.

Ответ 4

В моем случае у меня был веб-сайт с маршрутами ODATA (и контроллерами) и другими маршрутами API (и контроллерами). Случилось так, что мои другие маршруты просто противоречили ODATA, даже с разными пространствами и классами С# и т.д.

Первоначально мой контроллер был таким, например:

public class UserController : ApiController
{
    [HttpPost]
    public void Create([FromBody] string email)
    {
    }
}

У меня также был маршрут "Пользователь" в ODATA (другое пространство имен, разные URL-адреса и т.д.). Поэтому мне пришлось явно добавить атрибут Route, например:

public class UserController : ApiController
{
    [HttpPost]
    [Route("api/user/create")]
    public void Create([FromBody] string email)
    {
    }
}

Ответ 5

Я также получил эту ошибку, и в моем случае это была проблема с чувствительностью к регистру. Я позвонил

https://www.example.com/odata/MyEntities вместо

https://www.example.com/odata/myentities, так как он был зарегистрирован.

Обязательно проверьте свою конфигурацию маршрута и URL-адрес вызова.

Ответ 6

Добавление config.EnableDependencyInjection() в Startup.cs работало для меня.

var config = new HttpConfiguration();

config.EnableDependencyInjection()