当wcf遇到JSON ?

简介: 昨天在调试项目时,意外发现一个奇怪的问题,实在不知道如何准确描述,所以随便起了个标题。 项目中有一个wcf供jquery调用,wcf示例代码如下: /**//// /// 测试/// /// [OperationContract][WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.

昨天在调试项目时,意外发现一个奇怪的问题,实在不知道如何准确描述,所以随便起了个标题。

项目中有一个wcf供jquery调用,wcf示例代码如下:

img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif /**/ /// <summary>
img_33d02437d135341f0800e3d415312ae8.gif
/// 测试
img_33d02437d135341f0800e3d415312ae8.gif
/// </summary>
img_05dd8d549cff04457a6366b0a7c9352a.gif
/// <returns></returns>

img_a6339ee3e57d1d52bc7d02b338e15a60.gif [OperationContract]
img_a6339ee3e57d1d52bc7d02b338e15a60.gif[WebInvoke(Method 
=   " GET " , ResponseFormat  =  WebMessageFormat.Json)]
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
public   string  Test()
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif    
return "Hello World!";
img_05dd8d549cff04457a6366b0a7c9352a.gif}

 

简单得不能再简单了,返回一个json格式的Hello World!

在非IE浏览器里用 http://localhost/wcf/service.svc/Test/ 测试(因为IE7以上版本好象不能直接打开访问wcf中的办法,会提示禁止访问,所以只能用ff,chrome之类测试),返回的是{"d":"Hello World!"},完全正常!(这里的d:是微软自动为我们的数据加的一层壳)

前端用jQuery调用

img_a6339ee3e57d1d52bc7d02b338e15a60.gif < script type = " text/javascript " >
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif    $.getJSON(
" /wcf/service.svc/Test " function (data)  img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif        alert(data.d.toString());
img_05dd8d549cff04457a6366b0a7c9352a.gif    }
)
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
< / script>

弹出"Hello World!"一切都很理想
后来因为项目需要,有人觉得Test这个名称太土,想换个名字,而程序员又不乐意,于是用UriTemplate起了个别名HelloWorld应付,如下:

img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif /**/ /// <summary>
img_33d02437d135341f0800e3d415312ae8.gif
/// 测试
img_33d02437d135341f0800e3d415312ae8.gif
/// </summary>
img_05dd8d549cff04457a6366b0a7c9352a.gif
/// <returns></returns>

img_a6339ee3e57d1d52bc7d02b338e15a60.gif [OperationContract]
img_a6339ee3e57d1d52bc7d02b338e15a60.gif[WebInvoke(Method 
=   " GET " , ResponseFormat  =  WebMessageFormat.Json,UriTemplate = " HelloWorld " )]
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
public   string  Test()
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif    
return "Hello World!";
img_05dd8d549cff04457a6366b0a7c9352a.gif}

 

浏览器里用http://localhost/wcf/service.svc/HelloWorld 测试,报错如下:

使用“UriTemplate”的终结点无法用于“System.ServiceModel.Description.WebScriptEnablingBehavior”。

于是检查web.config

img_a6339ee3e57d1d52bc7d02b338e15a60.gif   < behaviors >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
< endpointBehaviors >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
< behavior  name ="V6.WebApp.wcf.ServiceAspNetAjaxBehavior" >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif      
< enableWebScript />      
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
</ behavior >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif    
</ endpointBehaviors >
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
</ behaviors >

<enableWebScript/>换成<webHttp/>,解决!

 

这时发现麻烦才刚开始,这里发现http://localhost/wcf/service.svc/HelloWorld返回的数据格式变成了"Hello World!",没有刚才的那一层套套(即d:),所以前端用alert(data.d.toString())当然会报错了,真不明白微软为啥要搞出这样标准不统一的JSON封装?

知道了问题所在,解决办法自然也明了:

1.要么把老老实实把Test方法名,换成HelloWorld
2.要么把前端alert(data.d.toString())改成alert(data.toString())


最终建议:

尽量还是不要采用wcf默认的json封装,可以用Stream这种原始格式自己实现,这样不管配置如何,都能保证统一的输出,如下:

img_405b18b4b6584ae338e0f6ecaf736533.gif img_1c53668bcee393edac0d7b3b3daff1ae.gif   /**/ /// <summary>
img_33d02437d135341f0800e3d415312ae8.gif
/// 辅助方法,用于输出流
img_33d02437d135341f0800e3d415312ae8.gif
/// </summary>
img_33d02437d135341f0800e3d415312ae8.gif
/// <param name="str"></param>
img_05dd8d549cff04457a6366b0a7c9352a.gif
/// <returns></returns>

img_a6339ee3e57d1d52bc7d02b338e15a60.gif private  Stream GetStream( string  str)
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif    MemoryStream ms 
= new MemoryStream();
img_33d02437d135341f0800e3d415312ae8.gif    StreamWriter sw 
= new StreamWriter(ms);
img_33d02437d135341f0800e3d415312ae8.gif    sw.AutoFlush 
= true;
img_33d02437d135341f0800e3d415312ae8.gif    sw.Write(str);
img_33d02437d135341f0800e3d415312ae8.gif    ms.Position 
= 0;
img_33d02437d135341f0800e3d415312ae8.gif    WebOperationContext.Current.OutgoingResponse.ContentType 
= "text/plain";
img_33d02437d135341f0800e3d415312ae8.gif    
return ms;
img_05dd8d549cff04457a6366b0a7c9352a.gif}

img_a6339ee3e57d1d52bc7d02b338e15a60.gif
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
/**/ /// <summary>
img_33d02437d135341f0800e3d415312ae8.gif
/// 测试
img_33d02437d135341f0800e3d415312ae8.gif
/// </summary>
img_05dd8d549cff04457a6366b0a7c9352a.gif
/// <returns></returns>

img_a6339ee3e57d1d52bc7d02b338e15a60.gif [OperationContract]
img_a6339ee3e57d1d52bc7d02b338e15a60.gif[WebInvoke(Method 
=   " GET " , ResponseFormat  =  WebMessageFormat.Json,UriTemplate = " HelloWorld " )]
img_a6339ee3e57d1d52bc7d02b338e15a60.gif
public  Stream Test()
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
img_a76e9bb6ed00cf1c9c9f4ee2f04b558b.gif {
img_33d02437d135341f0800e3d415312ae8.gif    
return GetStream("{'data':'Hello World!'}");
img_05dd8d549cff04457a6366b0a7c9352a.gif}

img_a6339ee3e57d1d52bc7d02b338e15a60.gif

前端
<script type="text/javascript">
$.getJSON("/wcf/service.svc/HelloWorld", function(a) {          
    alert(a.data.toString());
})
</script>

目录
相关文章
|
Web App开发 JSON JavaScript
艾伟:WCF以Json格式返回对象,客户端以JS调用显示
很少写东西,但是看到别人写的文章自己又禁不住写点,写了有时候又觉得不好意思给大家看! 今天好不容易鼓起勇气写点…… 这几天看了一些WCF的资料 第一感觉是:这玩艺太深了 第二感觉是:这玩艺,挺麻烦的(光配置就搞不明白) 今天调了半天,好不容易把这个返回Json对象,在客户端展示的实例给整理出来了。
681 0
|
XML JSON JavaScript
javascript post数据到WCF反馈json或者XML
前端代码: //创建XMLHTTPfunction createXMLHTTP(){var httpRequest;     try {        httpRequest = new XMLHttpRequest();     }     catch (e) {         try { ...
804 0
|
JSON 数据库 开发工具
silverlight动态读取txt文件/解析json数据/调用wcf示例
终于开始正式学习silverlight,虽然有点晚,但总算开始了,今天看了一下sdk,主要是想看下silverlight中如何动态调用数据,对于数据库的访问,sdk中的官方示例多用的是Ado.Net数据服务,方便到是方便,就是感觉Ado.
966 0
|
SQL 存储 JSON
silverlight + wcf(json格式) + sqlserver存储过程分页
silverlight并没有提供现成的分页控件,百度了一圈,也没有发现aspx中好用的类似AspNetPager成熟控件,网上现有的一些分页代码,很多也是基于1.0版本的,silverlight2.0的并不多,自个儿琢磨了一下,发现自己弄一个也并非难事,思路和主要代码分享如下: 1.
965 0
|
17天前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
3天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
7天前
|
JSON 缓存 前端开发
PHP如何高效地处理JSON数据:从编码到解码
在现代Web开发中,JSON已成为数据交换的标准格式。本文探讨了PHP如何高效处理JSON数据,包括编码和解码的过程。通过简化数据结构、使用优化选项、缓存机制及合理设置解码参数等方法,可以显著提升JSON处理的性能,确保系统快速稳定运行。