- 主题:WCF的base64binary如何在客户端反序列化
WCF的base64binary如何在客户端反序列化,也就是使用在客户端如何将byte[]类型的base64binary如何还原出来,研究了几天,没有搞定,总是显示乱码,另外,服务器端的程序是黑匣子,无法了解里面序列化过程。求高手指点迷津,在网上看了很多资料,有人说windows下面将byte[]的base64binary序列化传输的时候是采用gzip压缩传输的,客户端需要解压缩,结果我找了个gzip解压的函数,结果说幻数不正确,不知道哪位仁兄可以告诉如何客户端如何解码的方法。
--
FROM 219.140.167.*
兄弟是否知道如何解码吗?现将内容复制如下:
HTTP/1.1 200 OK
Content-Length: 1148
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Fri, 29 Mar 2013 04:30:17 GMT
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetAllHistoryByNameAndTime0320Response xmlns="http://tempuri.org/"><GetAllHistoryByNameAndTime0320Result>YgAAAHiczZm9btswEIBfJdBaWCRF/UMR4BodgjqxAxtFt4JQ5JiAJRYUEzd9hg7d+gTdM3Tq0qdp0McoJVttAjssYuDKTBZ5Z5Kfjne8o7KhlOxmsnhd3rxhq6tysmiU5PXltnt4fjJaMqk62TmP4+Js+G569KFa1c2xs1TqfYpQUywAAMuKNW7FCykasVBuISrkYUwRwWhWSs5W/CNTXNSoG7dxNiOk/M8Y6/XaXVNXyMv2jwS9PR3PumEHvG4Uq4vSybMnLbJTz6cTgnGG2sesk29nZjurv2CKFaJWkhWqX4ePcIRe1dcjyVWL4b4cj/U6WPpgyrbjpBnziqvmiKc1Xx0AADtKXpUOaiWnot5oeX6G7jU70XX76Pl5gDeyvq2FU9Hw9pWdsarMf3398fPTl7vbb3ffP7eaD4Raeaa61zsSF2VOMCXDVul+p9aZ86qcCl6r3MOEDjAdePGc0BTjFHfT/1VoWzuIhzCT5HFmP7TF7NtjpraYA1Bm0972iS3mEJQAAJkGjzPTxBZzBMrc23Ivc2yLOYa1s2Fv08gWcwLrz7GBObDE7GFYZkPc7vfA/2cmsP5simG2zirPA2UO6XO0M2weZoxhduyczDGsP1OTnT1bzLD+HDy/va2ZYf05NuUkds5nzQzrz5HpfLaTe2pm2LoqxoYaw079rJlh66rI4M8AAPaYYeuq0JCT+NbiNmxdRUhogLaTcGto2MKKBIYoFti5NdDQsJUV8Q2WDuxciSVzApuKEd9g6dBWHCOgudg+yRZxV3Qo8O5I+0m3GdiLzqP/yYv63ydeuKNDPibkvwHQU5FLAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==</GetAllHistoryByNameAndTime0320Result></GetAllHistoryByNameAndTime0320Response></s:Body></s:Envelope>
--
FROM 219.140.167.*
项目描述:
最近从网上获取一个silverlight的网页的数据,通过fiddle2.0分析出了svc文件的链接地址,从而得到了webservice的wsdl描述文件,通过webservices暴露出来的方法进行调用,能够获取普通的string类型的数据,但其中有个函数返回的是byte[] 类型的base64binary,通过直接tobase64string然后获取字符串的时候显示乱码,不知如何解决。求大侠帮助。
采用如下语句调用webservice服务:
EnvAQIServeiceClient myclient = new EnvAQIServeiceClient(); //建立客户端
byte[] base64str =myclient.GetDataAndIAQI0320("北京", ""); //获取数据
string desstr = Encoding.UTF8.GetString(base64str); //转换为字符串
通过上面的语句返回结果如下图(显示为乱码),以下为设置断点跟踪得到的结果:
WSDL的描述文件如下图:
通过fiddle抓包获取的内容如下:
抓包的内容文本如下:
HTTP/1.1 200 OK
Content-Length: 2820
Content-Type: text/xml; charset=utf-8
Server: Microsoft-IIS/7.5
X-Powered-By: ASP.NET
Date: Fri, 29 Mar 2013 05:25:22 GMT
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><GetDataAndIAQI0320Response xmlns="http://tempuri.org/"><GetDataAndIAQI0320Result>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</GetDataAndIAQI0320Result></GetDataAndIAQI0320Response></s:Body></s:Envelope>
通过在网上查阅有网友回答说服务器端对base64binary进行序列化传输的时候采用了gzip压缩,所以又下了一个gzip解码的函数,但解码过程中提示幻数不正确,解码函数如下:
public static byte[] Decompress(Byte[] bytes)
{
using (MemoryStream tempMs = new MemoryStream())
{
using (MemoryStream ms = new MemoryStream(bytes))
{
GZipStream Decompress = new GZipStream(ms, CompressionMode.Decompress);
Decompress.CopyTo(tempMs);
Decompress.Close();
return tempMs.ToArray();
}
}
}
我补充一下上面的内容,楼上这位兄弟回复得很详细,我现在是用C#开发,不知道如何用语句实现,楼上这位仁兄是否可以告知详细语句,把这个xml文本在客户端取出来,直接存到文件当中去
--
FROM 219.140.167.*
兄弟,你是高手,按照你的思路我来研究下
--
FROM 219.140.167.*
byte[] bytes = myclient.GetDataAndIAQI0320("北京", "");
//以下为偏移四个字节
MemoryStream ms = new MemoryStream(bytes, 4, bytes.Length-4 );
string str2 = DecompressString(ms.ToArray());
以下为deflateStream函数:
/// <summary>
/// 解压字符串
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string DecompressString(byte[] str)
{
return Encoding.UTF8.GetString(DecompressBytes(str));
}
/// <summary>
/// 解压二进制
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static byte[] DecompressBytes(byte[] str)
{
var ms = new MemoryStream(str) { Position = 0 };
var outms = new MemoryStream();
using (var deflateStream = new DeflateStream(ms, CompressionMode.Decompress, true))
{
var buf = new byte[1024];
int len;
while ((len = deflateStream.Read(buf, 0, buf.Length)) > 0)
outms.Write(buf, 0, len);
}
return outms.ToArray();
}
但是运行的时候报错,错误提示为:块的长度与它的补集不匹配。
--
FROM 219.140.167.*
还有哪位大全可以指点的啊?
--
FROM 219.140.167.*
有没有人能够解决啊?
--
FROM 219.140.167.*
非常的着急,求解决啊!
--
FROM 219.140.167.*