Какими должны быть формат и тип содержимого?

#c# #asp.net #asp.net-web-api #asp.net-core

#c# #asp.net #asp.net-web-api #asp.net-core

Вопрос:

Я создаю Asp.net основной веб-api для приема сообщения http, состоящего из нескольких частей. Вот необработанный http-пост, в нем три текстовые строки и один загруженный двоичный файл (может быть файл любого типа).

СООБЩЕНИЕ http://localhost:5001/api/ClosingDoc HTTP/1.1
Хост: localhost:5001
Соединение: поддерживается
Длина содержимого: 6957
Принять: application / json, text / plain, */*
Источник: http://localhost:8082
Пользовательский агент: Mozilla / 5.0 (Windows NT 6.1; WOW64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / 53.0.2785.116 Safari /537.36
Тип содержимого: составные / данные формы; граница =----WebKitFormBoundaryDTtxFp41DIpArUZ0
Реферер: http://localhost:8082/
Принять-Кодирование: gzip, deflate
Принять-Язык: en-US, en; q = 0.8, zh-CN; q = 0.6, zh; q = 0.4

------WebKitFormBoundaryDTtxFp41DIpArUZ0
Содержимое-Расположение: форма-данные; имя ="Идентификатор"

ANYTHING001
------WebKitFormBoundaryDTtxFp41DIpArUZ0
Содержимое-Расположение: форма-данные; имя ="docType"

Тест
------WebKitFormBoundaryDTtxFp41DIpArUZ0
Содержимое-Расположение: форма-данные; имя ="комментарии"

Тест
------WebKitFormBoundaryDTtxFp41DIpArUZ0
Содержимое-Расположение: форма-данные; имя = "control.PNG"; имя файла = "control.PNG"
Тип содержимого: изображение / png

 PNG
.....

Я создал класс ClosingDocInputFormatter : InputFormatter , теперь мне нужно добавить в него следующий код в Startup.cs.

 public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddApplicationInsightsTelemetry(Configuration);

    var connection = Configuration.GetConnectionString("DefaultConnection");
    services.AddDbContext<Models.StaticDataContext>(options => options.UseSqlServer(connection));

    services.AddMvc(o => {
        o.InputFormatters.Add(new ClosingDocInputFormatter());
        //??? x.OutputFormatters.Add(new ClosingDocOutputFormatter()); // No need?
        o.FormatterMappings.SetMediaTypeMappingForFormat(
            "???", MediaTypeHeaderValue.Parse("????")) // What the strings should be?
    });
    services.AddCors();
}
  

Вопросы.

  1. Нужно ли мне определять OutputFormatter, поскольку мне нужно только выполнить часть post?
  2. Методу o.FormatterMappings.SetMediaTypeMappingForFormat нужны два строковых параметра. Какими значениями они должны быть?

Комментарии:

1. strathweb.com/2016/02/…

2. В ссылке указано, что это может быть любая произвольная строка. Я добавил closingDoc и application/closingDoc соответственно. Однако я все еще получил ошибку System.InvalidOperationException: No media types found in 'MyService.Formatters.ClosingDocInputFormatter.SupportedMediaTypes'. Add at least one media type to the list of supported media types.

3. Я думаю, вы не использовали FormatFilter . Смотрите последний раздел.

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

5. Я добавил [FormatFilter] для контроллера и все равно получил ошибку. Я делаю сообщение так, чтобы URL был http://localhost:5001/api/ClosingDoc . Ошибка: System.InvalidOperationException: No media types found in 'MyService.Formatters.ClosingDocInputFormatter.SupportedMediaTypes'. Add at least one media type to the list of supported media types. at Microsoft.AspNetCore.Mvc.Formatters.InputFormatter.CanRead(InputFormatterContext context) at Microsoft.AspNetCore.Mvc.ModelBinding.Binders.BodyModelBinder.<BindModelAsync>d__3.MoveNext()