我目前正在运行web-serice,将呼叫返回到我已构建的iPhone客户端。 Web服务以soap的形式返回xml。
我们注意到的是,当我们使用特定功能时,呼叫所需的时间比UX的接受时间长。
以下是一些示例代码和示例xml
功能
public List<Foo> bar(....)
{
// stuff
return Bar;
}
将结果序列化为XML并在iPhone客户端中使用。
函数返回的XML示例。(根据用户使用客户端应用程序的方式,此xml可能会变得非常大)。
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<response xmlns="uri:Foo">
<result>
<p>
<num>string</num>
<d>int</d>
<pf>string</pf>
<pt>string</pt>
<ipk>boolean</ipk>
<ipa>boolean</ipa>
<va>
<ava xsi:nil="true" />
<ava xsi:nil="true" />
</va>
<dps>
<dp xsi:nil="true" />
<dp xsi:nil="true" />
</dps>
<dst>string</dst>
</p>
</result>
</response>
</soap:Body>
</soap:Envelope>
我基本上想要的是缩小数据。优选通过某种压缩。
是否可以在将XML返回到iPhone客户端之前压缩XML的大小?
我看了gzip,但无法抓住它,因为它适用于溪流。
任何提示和/或指示都将受到高度赞赏。谢谢阅读。
答案 0 :(得分:1)
TIPS /指针:
如果可能,请考虑使用JSON,它的占用空间较小。
查看使用DeflateStream class
答案 1 :(得分:1)
使用DeflateStream怎么样?这样,您可以将数据作为压缩字节数组而不是XML返回。我使用这种方法在内存中保存XML段以减少占用空间,并将其整体大小减少约80%,例如。
在服务器上压缩
using (var stream = new MemoryStream())
{
using (var zip = new DeflateStream(stream, CompressionMode.Compress, true))
{
xmlDoc.Save(zip, SaveOptions.DisableFormatting);
}
return stream.ToArray();
}
在客户端解压缩
using (var stream = new MemoryStream(compressedBytes))
{
using (var zip = new DeflateStream(stream, CompressionMode.Decompress))
{
return XDocument.Load(zip);
}
}
答案 2 :(得分:1)
如果你可以交换序列化,我会调查这个主题: Fast and compact object serialization in .NET
当然,如果您不想丢失xml格式,也可以使用压缩:
答案 3 :(得分:0)
如果您使用的是WCF 4.5或更高版本,则可以对二进制编码器使用压缩: http://msdn.microsoft.com/en-us/library/aa751889.aspx
答案 4 :(得分:0)
首先在网络服务器上启用压缩功能。这样你就不会担心手动压缩它,并且作为额外的好处,所有内容(除了img)都会被压缩,从而产生更好的体验。
我怀疑它是否会真正解决问题,因为你提到数据变大了。也许想要在客户端上发明一种不同的缓存方案,并在需要时(或在后台)请求delta。
有些事情比较困难,但在我看来会长期帮助你