OData v4 несвязанная функция с пользовательской маршрутизацией

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

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

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

Я пытался:

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

Я также попробовал:

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

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

2 ответа

  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());
    

Вы можете переопределить селектор контроллера по умолчанию для достижения этой цели. Вы можете создать новый класс, который наследует от 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());

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

Другие вопросы по тегам