Не зарегистрирован маршрут маршрута без 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()