当wcf遇到JSON ?
昨天在调试项目时,意外发现一个奇怪的问题,实在不知道如何准确描述,所以随便起了个标题。
项目中有一个wcf供jquery调用,wcf示例代码如下:
/**//// <summary>
/// 测试
/// </summary>
/// <returns></returns>
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)]
public string Test()
{
return "Hello World!";
}
简单得不能再简单了,返回一个json格式的Hello World!
在非IE浏览器里用 http://localhost/wcf/service.svc/Test/ 测试(因为IE7以上版本好象不能直接打开访问wcf中的办法,会提示禁止访问,所以只能用ff,chrome之类测试),返回的是{"d":"Hello World!"},完全正常!(这里的d:是微软自动为我们的数据加的一层壳)
前端用jQuery调用
<script type="text/javascript">
$.getJSON("/wcf/service.svc/Test", function(data) {
alert(data.d.toString());
})
</script>
弹出"Hello World!"一切都很理想 后来因为项目需要,有人觉得Test这个名称太土,想换个名字,而程序员又不乐意,于是用UriTemplate起了个别名HelloWorld应付,如下:
/**//// <summary>
/// 测试
/// </summary>
/// <returns></returns>
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,UriTemplate="HelloWorld")]
public string Test()
{
return "Hello World!";
}
浏览器里用http://localhost/wcf/service.svc/HelloWorld 测试,报错如下:
使用“UriTemplate”的终结点无法用于“System.ServiceModel.Description.WebScriptEnablingBehavior”。
于是检查web.config
<behaviors>
<endpointBehaviors>
<behavior name="V6.WebApp.wcf.ServiceAspNetAjaxBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
</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这种原始格式自己实现,这样不管配置如何,都能保证统一的输出,如下:
/**//// <summary>
/// 辅助方法,用于输出流
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private Stream GetStream(string str)
{
MemoryStream ms = new MemoryStream();
StreamWriter sw = new StreamWriter(ms);
sw.AutoFlush = true;
sw.Write(str);
ms.Position = 0;
WebOperationContext.Current.OutgoingResponse.ContentType = "text/plain";
return ms;
}
/**//// <summary>
/// 测试
/// </summary>
/// <returns></returns>
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,UriTemplate="HelloWorld")]
public Stream Test()
{
return GetStream("{'data':'Hello World!'}");
}
前端
<script type="text/javascript">
$.getJSON("/wcf/service.svc/HelloWorld", function(a) {
alert(a.data.toString());
})
</script>
- 07.LoT.UI 前后台通用框架分解系列之——强大的文本编辑器
- 洛谷P3358 最长k可重区间集问题(费用流)
- 08.LoT.UI 前后台通用框架分解系列之——多样的Tag选择器
- iOS多线程——RunLoop与GCD、AutoreleasePool你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里
- iOS多线程——你要知道的RunLoop都在这里你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里
- iOS网络——AFNetworking AFHttpSessionManager源码解析
- iOS网络——SDWebImage SDImageDownloader源码解析你要知道的NSURLSession都在这里
- iOS缓存 NSCache详解及SDWebImage缓存策略源码分析你要知道的NSCache都在这里
- freeRTOS信号量学习
- 微信扫码支付+Asp.Net MVC
- Linq中连接主要有组连接、内连接、左外连接、交叉连接四种
- 深入源码理解YYCache 、SDWebImage、AFNetworking、NSCache 缓存方式与对比
- Linq Like的操作
- iOS网络——AFNetworking AFURLSessionManager源码解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法