【发布时间】:2014-04-26 01:53:50
【问题描述】:
我正在尝试配置一些 odata 导航,但看不到问题所在。
配置:
public class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
var entitySetConfiguration = modelBuilder.EntitySet<Catalog>("Catalog");
entitySetConfiguration.EntityType.Ignore(t => t.OutboundCatalogItems);
entitySetConfiguration.EntityType.Ignore(t => t.OutboundColumns);
entitySetConfiguration.EntityType.Ignore(t => t.OutboundProcessor);
entitySetConfiguration.EntityType.Ignore(t => t.OutboundProcessorID);
entitySetConfiguration.EntityType.Ignore(t => t.RelationshipId);
entitySetConfiguration.EntityType.Ignore(t => t.CatalogConfigurationProperties);
var model = modelBuilder.GetEdmModel();
config.Routes.MapODataRoute("ODataRoute", "odata", model);
config.EnableQuerySupport();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "apicontrollers/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
注册
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
}
protected void Application_EndRequest(object sender, EventArgs e)
{
Helpers.DataAccess.DisposePDBUnitOfWork();
}
}
控制器
public class CatalogController : EntitySetController<Catalog, int>
{
private readonly PDBCoreUnitOfWork _unitOfWork;
public CatalogController()
{
_unitOfWork = new PDBCoreUnitOfWork(0);
}
public override IQueryable<Catalog> Get()
{
return _unitOfWork.Repository<Catalog>().Query().Get();
}
protected override void Dispose(bool disposing)
{
_unitOfWork.Dispose();
base.Dispose(disposing);
}
}
脚本
<script type="text/javascript">
var catalogApi = "/odata/Catalog";
$.getJSON(catalogApi)
.done(function(json) {
console.log("Json data: " + json);
})
.fail(function(jqxhr, textStatus, error) {
var err = textStatus + ", " + error;
console.log("Request Failed: " + err);
});
</script>
当使用提琴手 localhost:port/odata 返回 404 时,localhost:port/odata/Catalog 也是如此
我一定是在这里遗漏了一些基础知识。Unit of work with oData
更新 当我注释掉以下内容时:
protected void Application_Start()
{
//AreaRegistration.RegisterAllAreas();
//RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);
//GlobalConfiguration.Configure(ODataConfig.Register);
}
和
public class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
ODataModelBuilder modelBuilder = new ODataConventionModelBuilder();
//var entitySetConfiguration = modelBuilder.EntitySet<Catalog>("Catalog");
//entitySetConfiguration.EntityType.Ignore(t => t.OutboundCatalogItems);
//entitySetConfiguration.EntityType.Ignore(t => t.OutboundColumns);
//entitySetConfiguration.EntityType.Ignore(t => t.OutboundProcessor);
//entitySetConfiguration.EntityType.Ignore(t => t.OutboundProcessorID);
//entitySetConfiguration.EntityType.Ignore(t => t.RelationshipId);
//entitySetConfiguration.EntityType.Ignore(t => t.CatalogConfigurationProperties);
var model = modelBuilder.GetEdmModel();
//config.MapHttpAttributeRoutes();
config.Routes.MapODataRoute("odata", "odata", model);
config.EnableQuerySupport();
//config.Routes.MapHttpRoute(
// name: "DefaultApi",
// routeTemplate: "api/{controller}/{id}",
// defaults: new { id = RouteParameter.Optional }
// );
}
}
输入 localhost/port/odata 返回:
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<service xmlns="http://www.w3.org/2007/app" xmlns:atom="http://www.w3.org/2005/Atom" xml:base="http://localhost:45837/odata">
<workspace>
<atom:title type="text">Default</atom:title>
</workspace>
</service>
但是当我在 odata 之后添加 Catalog 时,它会抛出 404 not found。仍然迷失,但正在取得进展。
【问题讨论】:
-
您将路由配置为:
apicontrollers/...而不是odata/... -
我以为那个部分是告诉路由你的api在哪个部分,如果你有同名的api控制器和MVC控制器会发生什么?哦,源代码已经按照我的方式设置了,路由指向他的 api 文件夹。
-
不,它是WebAPI每条路由前的前缀,你可以把它改成
odata就可以了。 -
尝试使用
api/...和odata/...仍然收到 404 错误。路由怎么知道我的api控制器在ApiControllers/CatalogController.cs的路径中 -
冲突发生在应用程序启动中,在剥离除 webapi 之外的所有内容后,它可以工作。必须将控制器的扩展名更改为
OdataController
标签: jquery asp.net-web-api odata