首页 新闻 会员 周边

关于返回的文本,出现不该出现的字符

0
悬赏园豆:50 [待解决问题]

大神,问你一个问题呀!

现在我有如下地址:

http://115.29.230.180/html/defaultdocument/?link=http://www.jj59.com/zonghewenzhang/21/list_71_1.html

这个是一个类似json数组的文本,我用前台调用,可以直接得到正确的json,如下面的例子:
http://115.29.230.180/html/x.html
可以成功调用到获取的json,但是我用后台调用就会出现其他的无关字符,比如下图最前面的36e,以及最后面的0,以下是我的后端代码:

        public static string GetHtml(string url, string encoding)
        {
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "GET";       
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
            System.IO.Stream responseStream = response.GetResponseStream();
            System.IO.StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.GetEncoding(encoding));
            string srcString = reader.ReadToEnd();
            reader.Close();
            responseStream.Close();
            return srcString;


            //最后返回的总是类似这样的文本
        }
View Code

昨日书的主页 昨日书 | 初学一级 | 园豆:154
提问于:2014-12-08 20:34
< >
分享
所有回答(5)
0

小菜鸟一只给你点建议,把前面的36e和后面的0去掉就是了!mvc写后台还要自己照json格式一段一段码上去,也会出现多余字符的就是这么搞的!!

silence、角落 | 园豆:146 (初学一级) | 2014-12-08 21:07
0

 如果不是服务端返回的问题,那就怪异,也就只能按楼上的处理

Yu | 园豆:12980 (专家六级) | 2014-12-09 08:41

再补充一点:就是当我咋IIS中启用了静态压缩和动态压缩,直接浏览器访问http://115.29.230.180/html/defaultdocument/?link=http://www.jj59.com/zonghewenzhang/21/list_71_1.html

是不会出现第一行和最后一行的36e和0的,取消压缩然后浏览器访问才会有,但是最后用Fiddler截获的文本还是有36e和0

支持(0) 反对(0) 昨日书 | 园豆:154 (初学一级) | 2014-12-09 13:33
0

点击了你的第一个地址。发现数据返回包含前面的36e和末尾的0,所以可以确定是你的服务端返回的问题。检查服务端。

幻天芒 | 园豆:37175 (高人七级) | 2014-12-09 08:49

再补充一点:就是当我咋IIS中启用了静态压缩和动态压缩,直接浏览器访问http://115.29.230.180/html/defaultdocument/?link=http://www.jj59.com/zonghewenzhang/21/list_71_1.html

是不会出现第一行和最后一行的36e和0的,取消压缩然后浏览器访问才会有,但是最后用Fiddler截获的文本还是有36e和0

支持(0) 反对(0) 昨日书 | 园豆:154 (初学一级) | 2014-12-09 13:35

@断桥残雪々: 现在用浏览器访问没有多余字符了。具体什么情况,也不是很清楚。

支持(0) 反对(0) 幻天芒 | 园豆:37175 (高人七级) | 2014-12-09 14:26
0

测试了你的代码,

http://115.29.230.180/html/defaultdocument/?link=www.jj59.com/zonghewenzhang/21/list_71_1.html&callback=vitoc

发现返回数据如下

375
vitoc([{"title":"结果,跟项目无关,跟高度有关","link":"http://www.jj59.com/jjart/288941.html"},{"title":"你不敢闯不敢拼 你要青春有何用","link":"http://www.jj59.com/jjart/288833.html"},{"title":"佛法无边,普度众生","link":"http://www.jj59.com/jjart/288793.html"},{"title":"我收获了知识","link":"http://www.jj59.com/jjart/281717.html"},{"title":"细节决定成败","link":"http://www.jj59.com/jjart/280330.html"},{"title":"世界冰王的财富故事","link":"http://www.jj59.com/jjart/278802.html"},{"title":"做好一种模式,做好一种细分","link":"http://www.jj59.com/jjart/275510.html"},{"title":"存在的价值","link":"http://www.jj59.com/jjart/274049.html"},{"title":"书——心灵相契的挚友","link":"http://www.jj59.com/jjart/273042.html"},{"title":"考试后的假期","link":"http://www.jj59.com/jjart/272892.html"}])
0

所以你还是看看http://115.29.230.180/html/defaultdocument 这个代码哪里写错了吧。

 

问题出在你的那个前端解释这个错误的JSON不出问题,而使用后端时,会出问题。

但是最原始的,其实就是这个返回的JSON数据就出了问题。

我说了这么多问题,不知道你能不能明白问题是什么?!

爱编程的大叔 | 园豆:30839 (高人七级) | 2014-12-09 10:58

再补充一点:就是当我咋IIS中启用了静态压缩和动态压缩,直接浏览器访问http://115.29.230.180/html/defaultdocument/?link=http://www.jj59.com/zonghewenzhang/21/list_71_1.html

是不会出现第一行和最后一行的36e和0的,取消压缩然后浏览器访问才会有,但是最后用Fiddler截获的文本还是有36e和0

你再访问那个地址试试,我启用了压缩

支持(0) 反对(0) 昨日书 | 园豆:154 (初学一级) | 2014-12-09 13:37

@断桥残雪々: 你应该思考一下,正常情况下,IIS压缩不压缩,不应该出现这样的情况。

所以问题还是在这儿。你先保证不压缩也不返回多余的字符。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30839 (高人七级) | 2014-12-09 14:37
0
using System.Net;
using System.Net.Http;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Test
{
    [TestClass]
    public class UnitTest
    {
        [TestMethod]
        public void Blog_ShouldReturnArticles()
        {
            var url = "http://115.29.230.180/html/defaultdocument/?link=http://www.jj59.com/zonghewenzhang/21/list_71_1.html";
            var client = new HttpClient(new HttpClientHandler
            {
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
            });            

            var response = client.GetAsync(url).Result;
            if (response.IsSuccessStatusCode)
            {
                var responseText = response.Content.ReadAsStringAsync().Result;

                Assert.IsNotNull(responseText);
                Assert.IsTrue(responseText[0] == '[');                
            }
        }
    }
}

花了半小时,楼主给分吧。

关键在于后端压缩了。

另外,建议服务器上加上content-type = "application/json"(web api中有设置返回format),不然client端 response.Content.ReadAsAsync<>方法报错。

南昌炒粉 | 园豆:760 (小虾三级) | 2014-12-09 16:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册