我看过了 https://github.com/OData/ODataSamples/tree/master/WebApi/v4/DynamicEdmModelCreation 上的示例,用于动态 Odata 路由和模型生成。
我需要在 dot net core 中实现相同的功能,但由于 Asp.net 和 Asp.net core 在类/路由等方面有所不同,因此我无法将此代码转换为 dot net core。
有人能提供一些指导吗?
我的 Startup.cs Configure 方法如下 -
这里有什么我做错了吗?当我尝试访问http://localhost:port/odata/Products时,我得到了一些源为空的错误。
编辑(15-Jan):
将MatchAllRoutingConvention修改如下可重定向路由,但任何$metadata请求也会这样做(抛出异常)。而$filter查询也不起作用。所以任何提示/建议都将是有帮助的-
我需要在 dot net core 中实现相同的功能,但由于 Asp.net 和 Asp.net core 在类/路由等方面有所不同,因此我无法将此代码转换为 dot net core。
有人能提供一些指导吗?
我的 Startup.cs Configure 方法如下 -
IEdmModel model = this.GetEdmModel(app.ApplicationServices);
IList<IODataRoutingConvention> routingConventions = new List<IODataRoutingConvention>();
routingConventions.Insert(0, new MatchAllRoutingConvention());
app.UseMvc(routeBuilder => routeBuilder.MapODataServiceRoute("odata", "odata", model, new CustomPathHandler(), routingConventions));
CustomPathHandler.cs -
public class CustomPathHandler : DefaultODataPathHandler
{
public override ODataPath Parse(string serviceRoot, string odataPath, IServiceProvider requestContainer)
{
var path = base.Parse(serviceRoot, odataPath, requestContainer);
return path;
}
public override string Link(ODataPath path)
{
return base.Link(path);
}
}
ODataEndpointController.cs -
public class ODataEndpointController : ODataController
{
[EnableQuery]
[ODataRoute]
public EdmEntityObjectCollection Get()
{
// Get entity set's EDM type: A collection type.
ODataPath path = Request.ODataFeature().Path;
IEdmCollectionType collectionType = (IEdmCollectionType)path.EdmType;
IEdmEntityTypeReference entityType = collectionType.ElementType.AsEntity();
// Create an untyped collection with the EDM collection type.
EdmEntityObjectCollection collection =
new EdmEntityObjectCollection(new EdmCollectionTypeReference(collectionType));
// Add untyped objects to collection.
DataSourceProvider.Get(entityType, collection);
return collection;
}
MatchAllRoutingConvention.cs
public class MatchAllRoutingConvention : IODataRoutingConvention
{
public IEnumerable<ControllerActionDescriptor> SelectAction(RouteContext routeContext)
{
ControllerActionDescriptor test = new ControllerActionDescriptor();
test.ControllerName = "ODataEndpoint";
return new List<ControllerActionDescriptor> { test }.AsEnumerable();
}
}
这里有什么我做错了吗?当我尝试访问http://localhost:port/odata/Products时,我得到了一些源为空的错误。
编辑(15-Jan):
将MatchAllRoutingConvention修改如下可重定向路由,但任何$metadata请求也会这样做(抛出异常)。而$filter查询也不起作用。所以任何提示/建议都将是有帮助的-
public class MatchAllRoutingConvention : IODataRoutingConvention
{
public IEnumerable<ControllerActionDescriptor> SelectAction(RouteContext routeContext)
{
ControllerActionDescriptor odataControllerDescriptor = new ControllerActionDescriptor
{
ControllerName = "ODataEndpoint",
ActionName = "Get",
Parameters = new List<ParameterDescriptor>(),
FilterDescriptors = new List<FilterDescriptor>(),
BoundProperties = new List<ParameterDescriptor>(),
MethodInfo = typeof(ODataEndpointController).GetMethod("Get"),
ControllerTypeInfo = typeof(ODataEndpointController).GetTypeInfo()
};
return new List<ControllerActionDescriptor> { odataControllerDescriptor };
}
}