Ответ 1
Часть маршрутизации в ServiceStack объясняется на Ваш первый сайт объяснил wiki:
[Route("/hello/{Name}")]
соответствует только:
/hello/name
где as:
[Route("/hello")]
соответствует:
/hello?Name=XXX
Примечание. Тело запроса QueryString, FormData и HTTP не является частью маршрута (т.е. только путь/путь/информация), но все они могут использоваться в дополнение к каждому вызову веб-службы для дальнейшего заполнения запроса DTO.
и используя маршрут с логическим путем, например:
[Route("/hello/{Name*}")]
матчи:
/hello
/hello/name
/hello/my/name/is/ServiceStack
Еще один хороший вариант использования карт подстановочных знаков.
Поэтому для соответствия /Customers?Key=Value
и /Customers/{Id}
вам необходимо зарегистрировать соответствующие маршруты для обоих этих маршрутов, например:
Routes
.Add<GetContact>("/Contacts", "GET")
.Add<GetContact>("/Contacts/{ContactId}", "GET")
Как авторизовать маршруты на основе протоколов для всех служб
Кроме того, это связано с регистрацией Auto-маршрутов с помощью метода расширения AddFromAssembly, где этот единственный вызов:
Routes.AddFromAssembly(typeof(MyService).Assembly)
Проходит и сканирует все ваши сервисы (в указанных сборках) и регистрирует маршруты на основе протоколов на основе всех методов HTTP, которые вы реализовали. Например. если ваши службы GetContact
и UpdateContact
имели свойства Id
, они автоматически регистрировали следующие маршруты:
Routes
.Add<GetContact>("/Contacts", "GET")
.Add<GetContact>("/Contacts/{Id}", "GET")
.Add<UpdateContact>("/Contacts", "POST PUT")
.Add<UpdateContact>("/Contacts/{Id}", "POST PUT")
И если бы у вас была только одна служба Contacts
REST с реализациями для всех HTTP-глаголов, она зарегистрировала бы эти маршруты:
Routes
.Add<Contacts>("/Contacts", "GET POST PUT DELETE PATCH")
.Add<Contacts>("/Contacts/{Id}", "GET POST PUT DELETE PATCH")
Порядок разрешения маршрутизации
Это более подробно описано в New API Design wiki, но взвешивание, используемое для выбора маршрута, основано на:
- Сначала используются любые точные буквенные соответствия
- Точное совпадение глагола предпочтительнее всех глаголов
- Чем больше переменных на вашем маршруте, тем меньше у него
- Когда Маршруты имеют одинаковый вес, порядок определяется положением действия в службе или орденом регистрации (FIFO)
См. раздел Smart Routing в вики для примеров.
Отличная производительность
Поскольку Маршрутизация в MVC может быть медленной, когда у вас есть большое количество Маршрутов, я думаю, что стоит отметить, что реализация ServiceStack Routing реализована с хэш-поисками и поэтому не страдает от линейных проблем с регрессией производительности, которые могли возникнуть с MVC.