Получите неподдерживаемый тип мультимедиа при создании привязки пользовательской модели и использовании из запроса - PullRequest
0 голосов
/ 07 апреля 2020

in asp. net core 3.1 Я создаю пользовательскую модель Binder, и она отлично работает. в контроллере, когда я использую FromQuery со сложной моделью, я получаю Unsupported Media Type.

контроллер и класс:

    public class myModel
    {
        public myModel()
        {}
        public int ProjectId { get; set; }
        public int OwnerId { get; set; }
    }


[HttpGet("project/list/GetData")]
public async Task<IActionResult> GetData([FromQuery]myModel model)
        {
          //some code
        }

код запуска:

    services.AddMvc().AddMvcOptions(options =>
                {
                    options.AllowEmptyInputInBodyModelBinding = true;


                    IHttpRequestStreamReaderFactory readerFactory = services.BuildServiceProvider().GetRequiredService<IHttpRequestStreamReaderFactory>();
                    options.ModelBinderProviders.Insert(0, new DefaultsModelBinderProvider(options.InputFormatters, readerFactory));
                });

мой класс BinderProvider:

     public class DefaultsModelBinderProvider : IModelBinderProvider
        {
            private readonly IList<IInputFormatter> formatters;
            private readonly IHttpRequestStreamReaderFactory readerFactory;

            public DefaultsModelBinderProvider(IList<IInputFormatter> formatters, IHttpRequestStreamReaderFactory readerFactory)
            {
                this.formatters = formatters;
                this.readerFactory = readerFactory;
            }
            public IModelBinder GetBinder(ModelBinderProviderContext context)
            {

                if (context.Metadata.ModelType.BaseType.IsAssignableFrom(typeof(MyRequest)))
                    return new DefaultsModelBinder(formatters, readerFactory);

                return null;
            }

и ModelBinder:

        public class DefaultsModelBinder : IModelBinder
        {
            private BodyModelBinder defaultBinder;

            public DefaultsModelBinder(IList<IInputFormatter> formatters, IHttpRequestStreamReaderFactory readerFactory)
            {
                defaultBinder = new BodyModelBinder(formatters, readerFactory);
            }

            public async Task BindModelAsync(ModelBindingContext bindingContext)
            {
                await defaultBinder.BindModelAsync(bindingContext);
                if (!bindingContext.Result.IsModelSet) return; //<= problem is here,and IsModelSet was false

            //some code
            }

        }

мой ответ:

{
    "type": "https://tools.ietf.org/html/rfc7231#section-6.5.13",
    "title": "Unsupported Media Type",
    "status": 415,
    "traceId": "|a8d35c74-47e9398b95bd3d9f." 
}

Я не смог найти проблему Как вы думаете, в чем проблема и что должно Я делаю, чтобы решить эту проблему? спасибо за вашу помощь

1 Ответ

0 голосов
/ 07 апреля 2020

A 415 здесь означает просто, что MIME-тип запроса body не имеет никакого подходящего форматера в ASP. NET Core. Например, из коробки вы получите это, если отправите XML, поскольку форматеры XML не включены по умолчанию. Если вы добавите их, ошибка исчезнет, ​​потому что ASP. NET Ядро тогда знает, как обрабатывать тип mimetype application/xml, а именно, отправляя его на сериализатор XML для десериализации его в объект.

Ничто из этого не применимо к чему-либо FromQuery. Строка запроса не имеет типа MIME: это просто пары ключ-значение строк. Непонятно, как вы делаете запрос или как на самом деле выглядит запрос из вопроса, но чтобы получить эту ошибку, вы отправляете что-то в теле, и это что-то выключен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...