大神,问你一个问题呀!
现在我有如下地址:
这个是一个类似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; //最后返回的总是类似这样的文本 }
小菜鸟一只给你点建议,把前面的36e和后面的0去掉就是了!mvc写后台还要自己照json格式一段一段码上去,也会出现多余字符的就是这么搞的!!
如果不是服务端返回的问题,那就怪异,也就只能按楼上的处理
再补充一点:就是当我咋IIS中启用了静态压缩和动态压缩,直接浏览器访问http://115.29.230.180/html/defaultdocument/?link=http://www.jj59.com/zonghewenzhang/21/list_71_1.html
是不会出现第一行和最后一行的36e和0的,取消压缩然后浏览器访问才会有,但是最后用Fiddler截获的文本还是有36e和0
点击了你的第一个地址。发现数据返回包含前面的36e和末尾的0,所以可以确定是你的服务端返回的问题。检查服务端。
再补充一点:就是当我咋IIS中启用了静态压缩和动态压缩,直接浏览器访问http://115.29.230.180/html/defaultdocument/?link=http://www.jj59.com/zonghewenzhang/21/list_71_1.html
是不会出现第一行和最后一行的36e和0的,取消压缩然后浏览器访问才会有,但是最后用Fiddler截获的文本还是有36e和0
@断桥残雪々: 现在用浏览器访问没有多余字符了。具体什么情况,也不是很清楚。
测试了你的代码,
发现返回数据如下
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数据就出了问题。
我说了这么多问题,不知道你能不能明白问题是什么?!
再补充一点:就是当我咋IIS中启用了静态压缩和动态压缩,直接浏览器访问http://115.29.230.180/html/defaultdocument/?link=http://www.jj59.com/zonghewenzhang/21/list_71_1.html
是不会出现第一行和最后一行的36e和0的,取消压缩然后浏览器访问才会有,但是最后用Fiddler截获的文本还是有36e和0
你再访问那个地址试试,我启用了压缩
@断桥残雪々: 你应该思考一下,正常情况下,IIS压缩不压缩,不应该出现这样的情况。
所以问题还是在这儿。你先保证不压缩也不返回多余的字符。
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<>方法报错。