我想将这些数据发布到Web 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
,但好像我无法理解它如何匹配控制器方法的签名。
例如,将内容替换为此内容:
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(“不支持的媒体类型”)。
BsonMediaTypeFormatter
进行序列化。我猜你可以两种方式都有。我会在我的答案中添加另一个示例。 - Yuval Itzchakovvar byteArrayContent = new ByteArrayContent(stream.ToArray()); byteArrayContent.Headers.ContentType = new MediaTypeHeaderValue("application/bson"); var result = await client.PostAsync( "api/SomeData/Incoming", byteArrayContent);
- Minh Nguyen