前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >当wcf遇到JSON ?

当wcf遇到JSON ?

作者头像
菩提树下的杨过
发布2018-01-23 11:11:43
8800
发布2018-01-23 11:11:43
举报
文章被收录于专栏:菩提树下的杨过

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

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

代码语言:js
复制
/**//// <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调用

代码语言:js
复制
<script type="text/javascript">
    $.getJSON("/wcf/service.svc/Test", function(data) {
        alert(data.d.toString());
    })
</script>

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

代码语言:js
复制
/**//// <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

代码语言:js
复制
<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这种原始格式自己实现,这样不管配置如何,都能保证统一的输出,如下:

代码语言:js
复制
/**//// <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!'}");
}

前端

代码语言:js
复制
<script type="text/javascript">
$.getJSON("/wcf/service.svc/HelloWorld", function(a) {           
    alert(a.data.toString());
})
</script>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2009-11-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档