2017-01-05 2 views
2

Я создал контроллер «Утилиты», который не привязан к какой-либо модели и содержит только несвязанные функции.
Я хотел бы быть в состоянии назвать это через URL вроде следующего:
OData/Утилиты/SomeMethod()OData v4 несвязанная функция с настраиваемой маршрутизацией

Прямо сейчас я должен назвать это так:
OData/SomeMethod()

Как создать собственный маршрут для «утилит»?

Я пробовал:

[ODataRoutePrefix("Utilities")] 
public class UtilitiesController : ODataController 

Я также попытался:

[ODataRoute("Utilities/SomeMethod()"] 
public string SomeMethod() 

Но оба они бросают ошибку:
«Шаблон пути 'Утилиты/SomeMethod()' на Действие «SomeMethod» в контроллере «Утилиты» не является допустимым шаблоном пути OData. Ресурс не найден для сегмента «Утилиты».

ответ

0

Чтобы добиться этого, вы можете переопределить селектор контроллера по умолчанию. Вы можете создать новый класс, который наследуется от DefaultHttpControllerSelector, как это:

public class CustomControllerSelector : DefaultHttpControllerSelector 
{ 

    public override string GetControllerName(HttpRequestMessage request) 
    { 
     string controllerName = null; 
     // I haven't tested this, but here you can decide whether you want to 
     // route to your new controller or not 
     if (request.ODataProperties().Path.PathTemplate == "~/UnboundFunction") 
     { 
      controllerName = "UtilitiesController"; 
     } 
     else 
     { 
      controllerName = base.GetControllerName(request); 
     } 

     return controllerName; 
    } 
} 

И тогда вы можете заменить селектор контроллера, как это:

config.Services.Replace(typeof(IHttpControllerSelector), new CustomControllerSelector()); 

Это позволяет выбрать, какой контроллер использовать во время выполнения для каждого запрашивать

+0

Это не работает. Если вы попытаетесь вызвать URL-адрес «/ odata/Utilities/SomeMethod()», вы получите 500 Internal Server Error. Если вы попытаетесь вызвать «/ odata/SomeMethod()», то он войдет в CustomControllerSelector, но один раз туда не перейдет к правильному контроллеру. Вы получите «Тип не найден, который соответствует контроллеру с именем UtilitiesController». Контроллер существует. Кроме того, это все равно не позволит вам иметь «/ odata/Utilities/SomeMethod()», что и я пытаюсь сделать. – goroth

0
  1. Определение класса контроллера:

    public class UtilitiesController : ODataController 
    { 
        [System.Web.Http.HttpGet] 
        [ODataRoute("SomeMethod")] 
        public string SomeMethod() 
        { 
         // add your code 
        } 
    } 
    
  2. Карта маршрута:

    var config = new HttpConfiguration(); 
    
    var modelBuilder = new ODataConventionModelBuilder(); 
    
    modelBuilder.Function("SomeMethod").Returns<string>(); 
    
    config.MapODataServiceRoute("ODataRoute", "odata/Utilities", modelBuilder.GetEdmModel()); 
    
+1

Это изменит все текущие маршруты OData. Я хочу добавить новый настраиваемый маршрут для контроллера Utilities. – goroth

Смежные вопросы