没有注册非OData HTTP路由

Tee*_*jay 18 c# odata asp.net-web-api

我按照教程创建了一个WebAPI REST服务.

之后,我可以通过指向加载所有联系人的列表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());
Run Code Online (Sandbox Code Playgroud)

并且还在方法[EnableQuery]上添加了参数Contact.GetContacts().这样,我就可以查询这样的特定联系人:

http://baseaddress/odata/Contacts?$filter=startswith(Name,'A')
Run Code Online (Sandbox Code Playgroud)

它就像魅力一样.

不幸的是,当我放入时[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)
...
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能解决这个问题?

小智 24

我遇到了这个问题,因为我正在使用依赖注入,我设法通过添加GlobalConfiguration.Configuration.EnableDependencyInjection()到我的问题来解决这个问题startup.cs

恩.

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

  • 我**不是**使用DI,但现在我在我的`App_Start/WebApiConfig.cs`中有这个代码 - 这确实使它工作..*但是没有意义 (3认同)
  • 如果您没有使用GlobalConfiguration,请修改以上内容:`var httpConfiguration = new HttpConfiguration();``httpConfiguration.EnableDependencyInjection();``var request = new HttpRequestMessage(HttpMethod.Get,(Uri)Request.Url); ``request.SetConfiguration(httpConfiguration);`</ code> (2认同)

jt0*_*t03 5

添加config.EnableDependencyInjection()Startup.cs为我工作。

var config = new HttpConfiguration();

config.EnableDependencyInjection();
Run Code Online (Sandbox Code Playgroud)


gsu*_*ran 5

这个问题的关键是.EnableDependencyInjection()Configure方法中使用Startup.cs

如果您使用的是 ASP.net Core端点路由(如果您至少有 .net core 3.0 和 Microsoft.AspNetCore.OData v7.4.0,则推荐使用)

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();

    endpoints.Select().Filter().OrderBy().Count().MaxTop(10);
    endpoints.EnableDependencyInjection();//This guy solves the problem    
    endpoints.MapODataRoute("odata", "odata", GetEdmModel());
});
Run Code Online (Sandbox Code Playgroud)

否则,如果您使用MVC 路由(只有在 .net core 3.0 和 Microsoft.AspNetCore.OData v7.4.0 之前可用)

app.UseMvc(routeBuilder =>
{
    routeBuilder.Select().Filter().OrderBy().Count().MaxTop(10);
    routeBuilder.EnableDependencyInjection();//This guy solves the problem
    routeBuilder.MapODataServiceRoute("odata", "odata", GetEdmModel());
});
Run Code Online (Sandbox Code Playgroud)

进一步阅读:https : //devblogs.microsoft.com/odata/enabling-endpoint-routing-in-odata/