Как обрабатывать HTTP-запросы с различными значениями пути в Owin Middleware - PullRequest
0 голосов
/ 25 апреля 2018

Контекст

У меня есть приложение Owin, которое принимает HTTP-запросы к URL-адресу myapp / api / mgmt.Я реализую класс промежуточного программного обеспечения, который наследуется от OwinMiddleware и переопределяет метод Invoke (в отличие от использования контроллера или какого-либо другого механизма обработки запросов).

Я хотел бы обработать несколько запросов GET и POST, таких как:

  • myapp / api / mgmt / queue / id (запрос GET для получения информации об очереди с идентификатором = id .)

  • myapp / api / mgmt / queue / id ? Action = dequeue (POST-запрос на удаление элемента из очереди с идентификатором = id .)

  • myapp / api / mgmt / queue / id ? Action = enqueue (POST-запрос для помещения элемента в очередь с ID = id .)

  • myapp / api / mgmt / queue / id / itemid / status (запрос GET для получения статуса элементас идентификатором = itemid внутри очереди с идентификатором = id .)

Вопрос

Iхочу узнать как извлечь id и itemid из запросов, которые есть в URL, а также убедитесь, что они являются GUID.Я знаю, как получить параметры строки запроса: context.Request.Query["action"], но я не уверен, как получить значения в пути (то есть каждую строку, разделенную косой чертой).Ниже я расскажу, как мне это сделать, но мне интересно, если какой-либо из классов Оуинов обеспечивает более идиоматический / безопасный / эффективный способ обработки этих запросов.

Моя попытка

Способ, которым я попытался бы захватить различные запросы, был бы следующим:

string path = context.Request.Path.Value; //path should start with "/queue/id"
if (path.StartsWith("/queue")
{
   string[] pathValues = path.Split('/');
   // first value in pathValues should be ''
   if (pathValues.Length > 2 && pathValues[1] == "queue")
   {
       if (Guid.TryParse(pathValues[2], out Guid queueId))
       {
           if (pathValues.Length == 3) 
           {
               // Now we know it's either (1) a GET for queue info, (2) a POST to dequeue an item from the queue, or (3) a POST to enqueue an item to the queue
           }
           else if (pathValues.Length == 5)
           {
               if (Guid.TryParse(pathValues[3], out Guid itemId) && pathValues[4] == "status")
               {
                   // we know it's a GET request for the item's status
               }
           }
           // All other cases return a 400.
       }
   }
}

Повторюсь, мне интересно, есть ли лучший / более стандартный способ приблизиться к этому.

...