当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>

时间: 2024-09-06 02:00:01

当wcf遇到JSON ?的相关文章

Ajax与Wcf交互-JSON

在WCF的序列化中有DataContractJsonSerializer的格式化器,这就使得WCF相比传统的Xml Web Serice多了一种输入输出的编码格式:JSON.本文将介绍如何使用JSON实现Ajax与WCF之间的数据交互. JSON的全称是JavaScript Object Notation,是专门用于适应Ajax和Restful而出现的取代xml的编码格式.相比xml而言,它更适合javascript, 第一步: 在VS2008中创建一个.Net framework 3.5的网站

WCF以Json格式返回对象,客户端以JS调用显示

很少写东西,但是看到别人写的文章自己又禁不住写点,写了有时候又211.html">觉得不好意思给大家看! 今天好不容易鼓起勇气写点-- 这几天看了一些WCF的资料 第一感觉是:这玩艺太深了 第二感觉是:这玩艺,挺麻烦的(光配置就搞不明白) 今天调了半天,好不容易把这个返回Json对象,在客户端展示的实例给整理出来了.下面分享给大家 此实例:以IIS为Host承载 1.先建一个WCF Service 建一个ServiceContract接口 1 [ServiceContract] 2 pub

javascript post数据到WCF反馈json或者XML

前端代码: <script language="javascript" type="text/javascript">//创建XMLHTTPfunction createXMLHTTP(){var httpRequest;     try {        httpRequest = new XMLHttpRequest();     }     catch (e) {         try {             httpRequest = ne

艾伟:WCF以Json格式返回对象,客户端以JS调用显示

很少写东西,但是看到别人写的文章自己又禁不住写点,写了有时候又觉得不好意思给大家看! 今天好不容易鼓起勇气写点-- 这几天看了一些WCF的资料 第一感觉是:这玩艺太深了 第二感觉是:这玩艺,挺麻烦的(光配置就搞不明白) 今天调了半天,好不容易把这个返回Json对象,在客户端展示的实例给整理出来了.下面分享给大家 此实例:以IIS为Host承载 1.先建一个WCF Service 建一个ServiceContract接口 1 [ServiceContract]  2 public interfac

silverlight动态读取txt文件/解析json数据/调用wcf示例

终于开始正式学习silverlight,虽然有点晚,但总算开始了,今天看了一下sdk,主要是想看下silverlight中如何动态调用数据,对于数据库的访问,sdk中的官方示例多用的是Ado.Net数据服务,方便到是方便,就是感觉Ado.Net数据服务返回的xml太啰嗦了,一点也不精简,数据通讯量太大(N多无用的标签导致客户端与服务端之间传输数据增加了不少),于是想到能否直接用wcf返回json格式, 何况sdk中提到silverlight中System.Json已经完成了对json的解析 经实

ExtJs与WCF交互:生成树

上文做了下Ajax与WCF进行json交互的简单介绍,本文阐述一个具体的实际应用:ExtJs与WCF交互,生成树.也很简单.先看看最终的效果吧: 第一步: 创建一个.net framework 3.5的网站项目ExtJsTreeWcf 第二步: 在网站项目中创建一个启用了Ajax的WCF服务WcfTreeService.svc,创建好之后,对该服务做如下的更改: 1)在WcfTreeService.svc中增加Factory="System.ServiceModel.Activation.Web

用JSON做数据传输格式中的一些问题总结_json

向客户端提供JSON数据的方式 一. 用WCF提供Json数据 用WCF向客户端提供Json数据我们需要注意, A. 契约的定义, 在WebInvokeAttribute 或者 WebGetAttribute中的ResponseFormat设置为WebMessageForm.Json, 复制代码 代码如下: [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMes

.NET3.5和VS2008中的ASP.NET AJAX

在过去,我曾在<VS 2008 JavaScript Intellisense> 和 < VS 2008 JavaScript debugging> 中 讨论过JavaScript和AJAX方面的改进.下面是作为VS 2008和.NET 3.5一部分发布的一些ASP.NET AJAX运 行时特性的几个备注,以及你在VS 2008中打开现有ASP.NET AJAX 1.0项目时需要知道的几个重要事项. 包括在.NET 3.5中的ASP.NET AJAX ASP.NET AJAX 1.

赞叹:微软“创新杯”各国学生们的惊人表现!

问题描述 以"科技可以实现环境的可持续发展"为主题的微软"创新杯"2008全球学生科技大赛在法国巴黎落下帷幕."创新杯"让我相信,如果世界能够成为"某一天",那么一定是掌握在当代年轻的孩子们手中,就像他们展望前途,倚仗技术,坚信梦想,并把二者结合起来,年轻的激情与头脑的灵感碰撞,让梦想变为现实.出于个人兴趣,很开心的研究了孩子们所创造出来的主题,新鲜.美妙.回味无穷.孩子们发挥自己了的创造力,运用科技来解决当今困扰全球的环境问