Web API: Odata路由总是返回404响应
本文关键字:返回 响应 路由 API Odata Web | 更新日期: 2023-09-27 17:54:49
我是OData新手。我已经建立了一个ASP。. NET Web API控制器如下所示:
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Web.OData.Routing;
namespace HelloWebApi.Controllers
{
public class TestsController : ODataController
{
ProductsContext db = new ProductsContext();
private bool TestExists(int key)
{
return db.tests.Any(p => p.key== key);
}
protected override void Dispose(bool disposing)
{
db.Dispose();
base.Dispose(disposing);
}
[EnableQuery]
public IQueryable<test> Get()
{
return db.tests;
}
}
}
模型如下:
public class Test
{
[Key]
public int key { get; set; }
public string aaa { get; set; }
}
我还配置了RouteConfig
, ODdataConfig
和WebApiConfig
,如下所示:
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.Ignore("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "Default",
routeTemplate: "{controller}/{action}/{id}"
);
}
}
public class ODataConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
ODataModelBuilder builder = new ODataConventionModelBuilder();
builder.EntitySet<Test>("Tests");
config.MapODataServiceRoute("odata", "odata", builder.GetEdmModel());
}
}
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
以及global.asax
文件:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(config =>
{
ODataConfig.Register(config); //this has to be before WebApi
WebApiConfig.Register(config);
});
//FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
}
我试着做了一些修改来解决这个问题。但我一直得到一个HTTP 404未找到响应。我还尝试显式地添加一个[ODataRoute]
属性的动作方法名称;当我这样做的时候,我得到一个HTTP 406不可接受的响应。
我要配置的URL是:
http://localhost: 6701/odata/测试/
其中odata
为后缀,tests
为控制器名称。请指出我做错了什么。
ODataConventionModelBuilder
配置的路由是区分大小写的。在您的代码中,您定义了:
builder.EntitySet<Test>("Tests");
基于此,端点将是:
http://localhost:6701/odata/Tests/
注意Tests
中大写的T
这是为了保持与OData规范的兼容性而设计的。
也就是说,从Web API OData 5.4开始,您可以选择使用HttpConfiguration
类的EnableCaseInsensitive()
方法启用不区分大小写的路由。例如,在ODataConfig.Register()
方法中,您可以添加:
config.EnableCaseInsensitive(caseInsensitive: true);
有关更多信息,请参阅Microsoft的ASP中的基本不区分大小写支持。. NET Web API for OData V4 Docs.