Я хочу опубликовать эти данные на сервере веб-API:
public sealed class SomePostRequest
{
public int Id { get; set; }
public byte[] Content { get; set; }
}
Использование этого кода для сервера:
[Route("Incoming")]
[ValidateModel]
public async Task<IHttpActionResult> PostIncomingData(SomePostRequest requestData)
{
// POST logic here
}
а для клиента:
var client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:25001/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var content = new FormUrlEncodedContent(new Dictionary<string, string>
{
{ "id", "1" },
{ "content", "123" }
});
var result = await client.PostAsync("api/SomeData/Incoming", content);
result.EnsureSuccessStatusCode();
все работает нормально (по крайней мере, отладчик останавливается в точке останова в PostIncomingData
).
Поскольку существует массив byte
, я не хочу сериализовать его как JSON и хочу публиковать его как двоичные данные для уменьшения сетевого трафика (что-то вроде application/octet-stream
).
Как это можно достичь?
Я пытался играть с MultipartFormDataContent
, но выглядит так, как будто я просто не могу понять, как MultipartFormDataContent
будет соответствовать сигнатуре метода контроллера.
Например, заменив содержимое на это:
var content = new MultipartFormDataContent();
content.Add(new FormUrlEncodedContent(new Dictionary<string, string> { { "id", "1" } }));
var binaryContent = new ByteArrayContent(new byte[] { 1, 2, 3 });
binaryContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
content.Add(binaryContent, "content");
var result = await client.PostAsync("api/SomeData/Incoming", content);
result.EnsureSuccessStatusCode();
приводит к ошибке 415 ( "Неподдерживаемый тип носителя" ).