. NET Массив байтов загрузки ядра HttpClient выдает ошибку неподдерживаемого типа носителя - PullRequest
2 голосов
/ 16 июня 2020

Я пытаюсь загрузить простой байтовый массив для своего контроллера Web Api (ASP. NET Core 3)

using var client = new HttpClient() { BaseAddress = new Uri("http://someUrl.com/") };
var body = new ByteArrayContent(new byte[] {1, 2, 3});

var result = await client.PostAsync("api/somecontroller/content?someField=someData", body);

Controller

[HttpPost("content")]
public IActionResult Upload([FromBody]byte[] documentData, [FromQuery] string someField)
{
    ...

    return Ok();
}

, но это выдает ошибку 415 Unsupported media type. Зачем ? Мне нужно указать дополнительные данные в URL-адресе, но я не думаю, что здесь проблема.

Ответы [ 2 ]

3 голосов
/ 17 июня 2020

Хотя byte[] был бы отличным способом представления данных application/octet-stream, это не так по умолчанию в asp. net core Web API.

Вот простой обходной путь:

Отправить запрос через HttpClient:

using var client = new HttpClient() { BaseAddress = new Uri("http://localhost:62033") };
var body = new ByteArrayContent(new byte[] { 1, 2, 3 });
body.Headers.ContentType = MediaTypeHeaderValue.Parse("application/octet-stream");           
var result = await client.PostAsync("api/Values/content?someField=someData", body);

Действие получения в проекте веб-API:

[HttpPost("content")]
public IActionResult Upload([FromBody]byte[] documentData, [FromQuery] string someField)
{
        return Ok();
}

Пользовательский формат ввода в проекте веб-API:

public class ByteArrayInputFormatter : InputFormatter
{
    public ByteArrayInputFormatter()
    {
        SupportedMediaTypes.Add(Microsoft.Net.Http.Headers.MediaTypeHeaderValue.Parse("application/octet-stream"));
    }

    protected override bool CanReadType(Type type)
    {
        return type == typeof(byte[]);
    }

    public override Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
    {
        var stream = new MemoryStream();
        context.HttpContext.Request.Body.CopyToAsync(stream);
        return InputFormatterResult.SuccessAsync(stream.ToArray());
    }
}

Startup.cs в проекте веб-API:

services.AddControllers(options=> 
        options.InputFormatters.Add(new ByteArrayInputFormatter()));

Результат:

enter image description here

0 голосов
/ 17 июня 2020

Проблема вызвана атрибутом [FromBody], который поддерживает только простые типы. Вы можете использовать Преобразователи типов для других типов. Правильный код действия контроллера должен быть:

    [HttpPost("content")]
    public IActionResult content([FromQuery] string someField)
    {
        var documentData= new byte[Request.ContentLength.Value];
         Request.Body.ReadAsync(documentData);
        //...
        return Ok();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...