【发布时间】:2015-11-17 07:21:26
【问题描述】:
我有以下 web api 客户端,它使用 json 和 gzip 将数据发送到服务器:
public void Remote_Push(BlockList Blocks)
{
// Pushes pending records to the remote server
using (var Client = new HttpClient())
{
Client.BaseAddress = new Uri(Context.ServerUrl);
Client.DefaultRequestHeaders.Accept.Clear();
Client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var Content = JsonCompress(Blocks);
var T1 = Client.PostAsync("SyncPush/", Content); T1.Wait();
T1.Result.EnsureSuccess();
}
}
private static ByteArrayContent JsonCompress(object Data)
{
// Compress given data using gzip
var Bytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(Data));
using (var Stream = new MemoryStream())
{
using (var Zipper = new GZipStream(Stream, CompressionMode.Compress, true)) Zipper.Write(Bytes, 0, Bytes.Length);
var Content = new ByteArrayContent(Stream.ToArray());
Content.Headers.ContentType = new MediaTypeHeaderValue("application/json");
Content.Headers.ContentEncoding.Add("gzip");
return Content;
}
}
在服务器上,我在 web api 控制器中创建了以下操作:
[HttpPost]
public void SyncPush([FromBody]BlockList Blocks)
{
var Context = SyncCreateContext();
var Sync = new Processor(Context);
Sync.ServerPush(Blocks);
}
以前,我在客户端上使用过PostAsJsonAsync,效果很好。
现在,我已切换到 ByteArrayContent 和 gzip 并且不再工作,Blocks 在服务器上始终为 null。
我在这里遗漏了什么,有什么问题或可能是问题所在?
【问题讨论】:
-
只是一个想法。您是否尝试过([FromBody] 对象块)?如果这不起作用,我猜是变量名不匹配?
-
我已经尝试过
[FromBody]object Blocks并且仍然产生null。也许我需要某种服务器端处理程序来将 zip 解压缩为 json 或者它应该自动发生? -
可以试试 await client.PostAsJsonAsync("SyncPush/", Content);
-
是的,正如我在问题中所写的那样,它工作得很好,但是发布的数据没有被压缩。我希望压缩数据以进行传输。
-
注明。看看我的回答。但它没有经过测试。
标签: c# asp.net-mvc-4 http asp.net-web-api