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)
添加config.EnableDependencyInjection()在Startup.cs为我工作。
var config = new HttpConfiguration();
config.EnableDependencyInjection();
Run Code Online (Sandbox Code Playgroud)
这个问题的关键是.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/