MykolaPetiukh
@MykolaPetiukh
Директор кафе

Route parameter constraint 'mongoId' not resolved. Почему?

Чтоб в урлах распознавать формат айди Монги, создал такой constraint:
public class MongoIdConstraint:IRouteConstraint
    {
        public bool Match(HttpContext httpContext, IRouter route, string routeKey,
                      RouteValueDictionary values, RouteDirection routeDirection)
        {
            var regex = new Regex(@"[0-9a-f]{24}", 
                RegexOptions.CultureInvariant | RegexOptions.IgnoreCase, 
                TimeSpan.FromMilliseconds(100));
            
            if (!values.TryGetValue(routeKey, out var value)) return false;
            var parameterValueString = Convert.ToString(value, CultureInfo.InvariantCulture);
            return parameterValueString != null && regex.IsMatch(parameterValueString);
        }
    }


Замапил его в Startup:
services.Configure<RouteOptions>(options =>
            {
                options.ConstraintMap.Add("mongoId", typeof(MongoIdConstraint));
            });


Но почему-то не работает:
2f158357-5914-4281-9ea8-0cb35c86f960.png

Я перепроверил: запустил приложение и дернул в Постмэне урл с неподходящей под формат строкой -- приняло, как ни в чем не бывало. То есть, это не Райдер выделывается.
Правда, потом Монга ругнулась при запросе, но мне бы хотелось, что до запроса к базе дело не доходило.

Что я упускаю?
  • Вопрос задан
  • 107 просмотров
Решения вопроса 1
sarapinit
@sarapinit Куратор тега C#
Точу водой камень
В доках написан такой вариант конфигурации:
services.AddRouting(options =>
{
    options.ConstraintMap.Add("customName", typeof(MyCustomConstraint));
});

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

Я не уверен, что это поможет, но проверил бы 1й вариант тоже, вдруг баг какой.

UPD:
Проверил у себя, в MongoIdConstraint заходит -- уже хорошо.
Я почти полностью уверен, что регекс неверный,
должен быть
@"^[0-9a-f]{24}$"
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы