OData v4 несвязанная функция с пользовательской маршрутизацией
Я создал контроллер "Утилиты", который не привязан к какой-либо модели и содержит только несвязанные функции.
Я хотел бы иметь возможность вызывать это через URL, как показано ниже:
OData / Утилиты / SomeMethod ()
Прямо сейчас я должен назвать это следующим образом:
OData / SomeMethod ()
Как мне создать собственный маршрут для "утилит"?
Я пытался:
[ODataRoutePrefix("Utilities")]
public class UtilitiesController : ODataController
Я также попробовал:
[ODataRoute("Utilities/SomeMethod()"]
public string SomeMethod()
Но оба из них выдают ошибку:
"Шаблон пути" Utilities / SomeMethod () "в действии" SomeMethod "в контроллере" Утилиты "не является допустимым шаблоном пути OData. Ресурс не найден для сегмента" Утилиты "."
2 ответа
Определите класс контроллера:
public class UtilitiesController : ODataController { [System.Web.Http.HttpGet] [ODataRoute("SomeMethod")] public string SomeMethod() { // add your code } }
Карта маршрута:
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());
Это позволяет вам выбрать, какой контроллер использовать во время выполнения для каждого запроса