首页 新闻 会员 周边

未解决!!,C# mvc在控制器中分别用Get 和 post 模式调用天气url返回数据乱码

0
[已解决问题] 解决于 2016-10-20 14:43

请看:https://q.cnblogs.com/q/87289/

mr_hj的主页 mr_hj | 菜鸟二级 | 园豆:202
提问于:2016-10-20 10:14
< >
分享
最佳答案
0

试了下,这个破站点在响应的时候用gzip压缩过了,但尼玛响应头里面又不包含gzip。

你在这句下面Stream myResponseStream = response.GetResponseStream();

再加一句

using (var gStream = new GZipStream(myResponseStream, CompressionMode.Decompress))
                        {

 StreamReader myStreamReader = new StreamReader(gStream, Encoding.UTF8);

....

}

就可以了.

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2016-10-20 11:03

对头,这个破站点在响应的时候用gzip压缩过了,我搜到时java的,尼玛,不会用啊

http://www.cnblogs.com/hotlove/p/5435324.html

http://blog.csdn.net/sugar_tea/article/details/45224109

mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 11:07

@mr_hj: 你把我上面的代码加到你里面去就可以了。理论上是否启用压缩是客户端决定的,应该是你发个请求告诉服务端,我这边可以接受哪些压缩方式,服务端如果支持你请求中的压缩方式才会进行压缩,压缩后再在响应中告知客户端我用什么方式压缩了,你那边再用对应方式解压。

 

不过不排除这是最前面的负载均衡没配好,把后端的响应头给去掉了。

Daniel Cai | 园豆:10424 (专家六级) | 2016-10-20 11:10

@Daniel Cai: 谢谢

mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 11:11
其他回答(1)
0

还没解决???

顾晓北 | 园豆:10844 (专家六级) | 2016-10-20 10:24

是啊

支持(0) 反对(0) mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 10:24

头都大了

支持(0) 反对(0) mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 10:25

@mr_hj: 这还是缺基础知识。。。

支持(0) 反对(0) 顾晓北 | 园豆:10844 (专家六级) | 2016-10-20 10:27

@顾晓北: 对头,有些东西都忘完了

支持(0) 反对(0) mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 10:28

@mr_hj: ps下,你那个帖子中的方法UrlUtf_8这个就是HttpUtility.UrlEncode(string,Encoding)

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-10-20 11:07

@Daniel Cai: PS:谢谢

支持(0) 反对(0) mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 11:08

@Daniel Cai:  PS:如果HttpUtility.UrlEncode()中是完整的URL地址,编码出来会有错误,最好只编码参数

支持(0) 反对(0) mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 11:14

@mr_hj: 这个本来就是对url参数做encode的,你对整个url做编码的话那就是期望整个url作为参数了。

比如http://xxx.com/?redirecturl=(your redirect url as paramter)

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-10-20 11:20

@Daniel Cai:  -_-!   ,我好想多此一举了,谢谢你了,有问题我再问你

支持(0) 反对(0) mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 11:24

@Daniel Cai: 解决了,但是post方式的该怎么改!!

支持(0) 反对(0) mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 14:12

@mr_hj: 你post又有什么问题?

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-10-20 15:15

@Daniel Cai: 我是这样写的,parameters集合是<参数名, 参数编码过的值>

public string PostFunction(string url, Dictionary<string, string> parameters)
        {
            string serviceAddress = url;
            //HttpWebRequest类继承于WebRequest,并没有自己的构造函数,需通过WebRequest的Creat方法 建立,并进行强制的类型转换 
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.ContentType = "application/json";
            request.Method = "POST";

            using (StreamWriter dataStream = new StreamWriter(request.GetRequestStream()))
            {
                dataStream.Write(parameters);
                dataStream.Close();
            }
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            string encoding = response.ContentEncoding;
            if (encoding == null || encoding.Length < 1)
            {
                encoding = "UTF-8"; //默认编码  
            }
            //解析josn

            Stream myResponseStream = response.GetResponseStream();
            using (var gStream = new GZipStream(myResponseStream, CompressionMode.Decompress))
            {
                //Encoding.GetEncoding("UTF-8")转码
                StreamReader myStreamReader = new StreamReader(gStream, Encoding.GetEncoding("UTF-8"));
                string retString = myStreamReader.ReadToEnd();
                JObject jo = JObject.Parse(retString);
                myStreamReader.Close();
                response.Close();
                myResponseStream.Close();
                return retString;
            }
}            
支持(0) 反对(0) mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 15:28

@mr_hj: 你传递的实参是什么?

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-10-20 15:39

@Daniel Cai: 比如url=http://wthrcdn.etouch.cn/weather_mini?

parameters={city,%E5%8C%97%E4%BA%AC}

支持(0) 反对(0) mr_hj | 园豆:202 (菜鸟二级) | 2016-10-20 15:42

@mr_hj: 你这个post写错了。dataStream.Write(parameters);

这个不是直接把dictionary写到输出里面,你要把dictionary中的keyvaluepair拉出来拼成{key}={value}的格式,中间以&符号隔开。

然后用你期望的encoding,比如你这边是utf-8获取这个字符串的byte数组,数组的长度就是你request的contentlength(没这个服务端怎么知道你要发多少数据过来?),然后将这个byte数组通过dataStream.Write方法进行输出

支持(0) 反对(0) Daniel Cai | 园豆:10424 (专家六级) | 2016-10-20 17:30
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册