Контекст
У меня есть приложение 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.
}
}
}
Повторюсь, мне интересно, есть ли лучший / более стандартный способ приблизиться к этому.