Маршрутизация значений атрибутов в параметр Model / FromBody в ASP.NET CORE - PullRequest
0 голосов
/ 01 июля 2019

Я работаю над основным веб-API-приложением .NET, где я хочу, чтобы значения маршрутизации URL-адресов были указаны в параметре Model / FromBody. Если свойство маршрутизации существует в модели From body.

Есть ли для этого какое-либо общее решение, т.е. оно будет работать для всех типов моделей.

Мы уже нашли пользовательское связующее для модели, но оно работает для конкретного типа модели. Я ищу специальную модель, которая работает для всех типов моделей.

например:

Action route: [Route("AH/{userId}")]
Url : ../AH/123
From body: 
{
"userId":"",
"Value" : "Some value"
}

Теперь значение маршрутизации 123 необходимо сопоставить со свойством модели FromBody "userId"

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Для вашего текущего запроса "userId":"" сделает запрос неудачным, поскольку "" не может быть преобразовано в значение типа int.

Чтобы обойти ваши требования, вы можете изменить тело запроса перед привязкой модели, выполнив следующие шаги:

  1. ModelResourceFilterAttribute

    public class ModelResourceFilterAttribute : Attribute, IResourceFilter
    {
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
        }
    
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            context.HttpContext.Request.EnableRewind();
            var routeData = context.RouteData;
            var stream = context.HttpContext.Request.Body;
            using (var streamReader = new StreamReader(context.HttpContext.Request.Body))
            {
                var json = streamReader.ReadToEnd();
                if (json != "")
                {
                    var jsonObj = JObject.Parse(json);
                    foreach (var item in routeData.Values)
                    {
                        JToken token;
                        if (jsonObj.TryGetValue(
                            item.Key,
                            StringComparison.InvariantCultureIgnoreCase,
                            out token))
                        {
                            var jProperty = token.Parent as JProperty;
                            if (jProperty != null)
                            {
                                jProperty.Value = item.Value.ToString();
                            }
                        }
                    }
                    var body = jsonObj.ToString(Formatting.Indented);
                    byte[] byteArray = Encoding.UTF8.GetBytes(body);
                    //byte[] byteArray = Encoding.ASCII.GetBytes(contents);
                    context.HttpContext.Request.Body = new MemoryStream(byteArray);
                }
    
            }            
        }
    }
    
  2. Регистрация ModelResourceFilterAttribute

    services.AddMvc(options =>
    {
        options.Filters.Add(typeof(ModelResourceFilterAttribute));
    }).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    
0 голосов
/ 01 июля 2019

Нельзя заполнить параметр маршрута из тела запроса. Параметр маршрута является частью URL и поэтому должен существовать независимо от того, какое тело фактически отправлено.

Несмотря ни на что, вы никогда не должны доверять чему-либо, подобному идентификатору, полученному из тела почтового запроса. Всегда получайте эту информацию из URL. URL-адрес определяет уникальный ресурс, поэтому публикация по этому URL-адресу может повлиять только на этот уникальный ресурс. Если вы полагаетесь на тело сообщения, то злонамеренный пользователь может манипулировать опубликованным значением, чтобы потенциально изменить ресурсы, к которым у него не должно быть доступа.

...