.Net 7 ServiceStack 6.4 ломает маршрут API, который имеет только "/api"

Пытаюсь предоставить больше информации и не уверен, насколько она актуальна. Один из наших webapi развернут в IIS: abcdomain.com/xyzweb. Мы начали обновлять нашу среду до .net 7 с .net 5. Веб-API также использует ServiceStack 6.4.

Один из маршрутов, определенных в плагине С# Webapi, ServiceStack, — «/api». До недавнего времени запросы к конечной точке abcdomain.com/xyzweb/api были в порядке. Но теперь (обновление .net 7?) мы заметили, что вызовы конечной точки не достигают обработчика (метод http get/post). У нас есть небольшое промежуточное программное обеспечение, определенное в методе конфигурации startup.cs, и мы видим поток выполнения через код промежуточного программного обеспечения, когда выполняется запрос abcdomain.com/xyzweb/api, и промежуточное программное обеспечение завершается вызовом next(), после чего поток выполнения теряется (webapi до сих пор жив).

После долгих испытаний я что-то прочитал, но не смог разобраться в содержании, пошел дальше и изменил определение маршрута на «/apihello» вместо «/api», после чего запросы начали работать, как раньше.

Любые указатели, что заставило его сломаться или что заставило его работать?

Поиск с «апи» затруднен, выдает только нерелевантные результаты.

Я хотел бы добавить, что перед изменением /api на /apihello http-запрос вернет HTTP-статус 200 (хотя он не пошел в обработчик) и необработанный ответ «Ошибка: System.NotImplementedException: операция '' не существует для эту услугу».

Может ли это быть связано?

nikstra 19.02.2023 22:21

Не могли бы вы поделиться более подробной информацией о том, как вы настроили конечную точку API?

Md Farid Uddin Kiron 20.02.2023 10:03

@MdFaridUddinKiron конечная точка — это просто «/api» для GET, POST и DELETE.

padhu 21.02.2023 14:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обновлять:

Я воспользовался возможностью использовать предыдущий неиспользованный маршрут /api/, чтобы вернуть индекс доступных API (, сгруппированных по тегам ) со ссылками на их прямой JSON API Route и просмотреть его в API Explorer, например:

Это изменение доступно в версии 6.6.1+, которая теперь доступна на MyGet.


Вы можете отключить (или изменить) предопределенный маршрут ServiceStack JSON/api с помощью:

ConfigurePlugin<PredefinedRoutesFeature>(feature => feature.JsonApiRoute = null);

@mythyz Ссылка, на которую вы ссылаетесь, побудила меня изменить /api на /apihello. Я сделал вывод, что маршрут по умолчанию /api теперь рассматривается как зарезервированный маршрут. Но текст не был прямо о том, как это изменение нарушит существующую реализацию, а ответ на http-запрос сбил с толку (я отредактировал свой вопрос вместе с ответом).

padhu 20.02.2023 00:19

Предопределенный маршрут JSON API ожидает URL-адрес в формате /api/{RequestDto} — если DTO запроса не соответствует допустимому имени DTO запроса, произойдет сбой. Отключите JsonApiRoute=null, если хотите использовать /api* для других целей.

mythz 20.02.2023 00:32

так как я вижу, что вы являетесь участником репозитория сервисного стека, добавили мои предложения к ответу.

padhu 21.02.2023 14:56

@padhu К вашему сведению, пустой маршрут /api/ теперь возвращает сгруппированный индекс API со ссылками на их прямые API и для просмотра API в API Explorer.

mythz 22.02.2023 11:53
Ответ принят как подходящий

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

  1. HTTP-запрос не должен отвечать со статусом HTTP 200, если поток выполнения даже не достиг моего обработчика запросов.
  2. Необходимо добавить аналогичное утверждение , например AssertOperationExists , которое объясняет, что имя операции пусто и что предопределенный маршрут API JSON ожидает URL-адрес в формате /api/{RequestDto} вместо Ошибка: System.NotImplementedException: операция '' не выполняется существуют для этой службы, которая не помогает.

Другие вопросы по теме