Я пытаюсь настроить некоторую навигацию odata и не вижу, что проблема здесь.
Config:
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>
При использовании fiddler localhost: port/odata возвращает 404, так что localhost: port/odata/Catalog
Мне, должно быть, не хватает части фунтамента. Единица работы с 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>
Но когда я добавляю Catalog
после odata, он выталкивает 404 не найден. Все еще потеряно, но прогресс.
Мне нужно было поменять порядок регистрации
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(ODataConfig.Register);
}
И изменил это
public class CatalogController : EntitySetController<Catalog, int>
{
....
}
К этому
public class CatalogController : OdataController
{
....
}
EntitySetController и AsyncEntitySetController удаляются в новой версии WebAPI. Вы всегда можете использовать " public class {EntitySetName}Controller: ODataController
как ваш контроллер.
Кстати, вы можете сослаться на следующий блог для нового использования WebApi 2.2 с OData V4:
apicontrollers/...
неodata/...