Adding a new OData controller fails existing controller

后端 未结 1 1195
温柔的废话
温柔的废话 2020-12-11 10:08

I am building a sample from two Web API OData samples, each of them works fine as a separate project. But when I add second ODataController class, then the site no longer wo

相关标签:
1条回答
  • 2020-12-11 10:21

    By default, when map OData attribute route conventions, the default logic of HTTP controller selector IHttpControllerSelector uses HttpConfiguration's DefaultAssembloesResolver, which will look up all controller types in an app domain. The scope could be reduced to controllers belong to a model.

    We can customize the MapODataServiceRoute extension methods. Some code snippet:

    public class Startup
    {
        public void Configuration(IAppBuilder builder)
        {
            var config = new HttpConfiguration();
    
            config.CustomMapODataServiceRoute(routeName: "functions route", routePrefix: "functions",
                model: FunctionStartup.GetEdmModel(),
                controllers: new[] { typeof(ProductsController) });
            config.CustomMapODataServiceRoute(routeName: "actions route", routePrefix: "actions",
                model: ActionStartup.GetEdmModel(),
                controllers: new[] { typeof(MoviesController) });
    
            config.EnsureInitialized();
    
            builder.UseWebApi(config);
        }
    }
    
    public class CustomAttributeRoutingConvention : AttributeRoutingConvention
    {
        private readonly List<Type> _controllers = new List<Type> { typeof(MetadataController) };
    
        public CustomAttributeRoutingConvention(IEdmModel model, HttpConfiguration configuration, IEnumerable<Type> controllers)
            : base(model, configuration)
        {
            _controllers.AddRange(controllers);
        }
    
        public override bool ShouldMapController(HttpControllerDescriptor controller)
        {
    
            return _controllers.Contains(controller.ControllerType);
        }
    }
    
    public static class HttpConfigExt
    {
        public static ODataRoute CustomMapODataServiceRoute(this HttpConfiguration configuration, string routeName,
            string routePrefix, IEdmModel model, IEnumerable<Type> controllers)
        {
            var routingConventions = ODataRoutingConventions.CreateDefault();
            routingConventions.Insert(0, new CustomAttributeRoutingConvention(model, configuration, controllers));
            return configuration.MapODataServiceRoute(routeName, routePrefix, model, new DefaultODataPathHandler(),
                routingConventions);
        }
    }
    
    0 讨论(0)
提交回复
热议问题