Поймать все URL, заканчивающиеся с GUID - PullRequest
0 голосов
/ 04 июня 2019

Я создаю API в .Net Core 2.1 и имею систему подкачки, где пользователь может запрашивать большие объемы, которые возвращаются кусками настраиваемого размера. Когда блок отправляется, он будет содержать GUID, который является ссылкой на следующий блок данных

Например, если у нас есть попадание, которое возвращает 526 результатов, оно разделит данные на 5 x 100 и 1 x 26 фрагментов записи. Первый удар получен из GET / events /

Вторая страница данных будет получена из чего-то вроде GET / events / 95d9f018-bff9-46e7-ad86-9b9d6734cc0d

У меня уже есть несколько маршрутов для каждого из моих методов контроллера

[HttpGet("/events/"]
public ActionResult GetAllEvents() {}

[HttpGet("/events/{EventId}"]
public ActionResult GetEvent(int EventId) {}

[HttpGet("/events/after/{AfterDate}"]
public ActionResult GetEventsAfter(DateTime AfterDate) {}

и в некоторых случаях методы могут иметь несколько значений маршрута. То, что я хотел бы добавить, это единственная перехват всех, где, если URL заканчивается GUID, он маршрутизируется по-другому.

В настоящий момент я вижу, что, если я добавлю GUID, он перейдет в метод «GetEvent»

Я попытался добавить маршрут в MVC

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "Continuation",
        template: "Route/{*ContinuationToken}",
        defaults: new { controller = "Continuation", action = "GetPagedResponse" },
        constraints: new { ContinuationToken = @"(?im)^[{(]?[0-9A-F]{8}[-]?(?:[0-9A-F]{4}[-]?){3}[0-9A-F]{12}[)}]?$" }
    );
});     

Но очевидно, что это неправильный подход к реализации, поскольку запрос все еще направляется на оригинальный контроллер и действие, а не на ContinuationController

Есть ли способ направить все запросы, заканчивающиеся Guid, к определенному контроллер и действие?

1 Ответ

0 голосов
/ 10 июня 2019

Попробуйте сделать это,

В контроллере, который вы хотите передать токену продолжения, добавьте этот фрагмент,

        [Route("/continuation/{continuationToken:guid}")]
        public IActionResult nextResult(Guid continuationToken)
        {
            return View();
        }

А в твоем Startup.cs у меня есть что-то похожее на твой пример.

routes.MapRoute(
                    name: "guidroute",
                    template: "{controller}/{*guid:guid}",
                    defaults : new { controller = "continuation"}
                     );

и добавляется перед маршрутом по умолчанию.

...