• WCF返回JSON及EXT调用WCF


    差不多整了一天,这个东东刚开始看,非常好的框架,只是配置麻烦些,声明性编程,一时转不过弯弯来,声明的特性类慢慢一个一个了解吧

    目标是EXT调用(POST/GET)WCF,数据均以JSON格式传输,理解框架是代码自动生成三层框架+WCF+EXT,

    WCF返回JSON的方式,网上流传些两种方式,经测试都可以达到效果,分别是

    1. jQuery调用WCF需要注意的一些问题
    2. WCF以Json格式返回对象,客户端以JS调用显示

    第一种,dudu大侠的做法是用特性类声明,如

            [OperationContract, WebInvoke( Method = "POST", ResponseFormat = WebMessageFormat.Json )]
            public IList<BA_MenuEntity> DoWork( BA_MenuEntity e ) {
                return BA_MenuBLL.Singleton.Select( new BA_MenuEntity() { Parent = 0 } );
            }

    其中ResponseFormat = WebMessageFormat.Json 这一行就可以,比较简单

    第二种,后者成峰大侠的做法是利用配置实现返回JSON,具体操作如下

    1,添加配置节点,自定义绑定

          <customBinding>
            <binding name="JsonMapper">
              此处配置相当重要,使用了我们编写的JsonContentTypeMapper类,约定返回值类型是Json
              <webMessageEncoding webContentTypeMapperType="Microsoft.Ajax.Samples.JsonContentTypeMapper, JsonContentTypeMapper, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
              </webMessageEncoding>
              <httpTransport manualAddressing="true"/>
            </binding>
          </customBinding>

    2,写代码继承自WebContentTypeMapper,并在配置中指定此类的子类

        public class JsonContentTypeMapper : WebContentTypeMapper {
            public override WebContentFormat GetMessageFormatForContentType( string contentType ) {
                return WebContentFormat.Json;
            }
        }

    -----------------------------------------------------华丽的分隔线--------------------------------------------------------------

    个人比较喜欢前者,dudu大侠的做法,简单些

    遇到的其它的问题

    1,EXT调用WCF时的传参,如上边的代码,DoWork接收一个自定义实体,该自定义实体比较娇情,它继承了其它的父类,so,一直无法正确返回JSON数据,最后得知:父类同样需要[DataContract]标注,如果该父类有虚属性,则子类必须指定override或new关键字,虽然VS可以编译通过,但WCF无法返回数据

    2,出现method not allowed,这个简单,多半是POST/GET方法不对应,如客户端GET请求,而服务器端指定了仅支持POST就会报这个错

    3,EXT的AJAX调用WCF时,比jQuery简单些,比dudu那篇简单,起码没有总结部分的3,5(1,2,3是必须的),注意使用EXT的jsonData配置,代码如下

        var webpost = { "__type": "BA_MenuEntity:#Tstring.Core.Entity", "CnName": "信息发布", "EnName": "Information", "ExGUID": null, "ExInclude": false, "ExReamrk": null, "Ext": null, "ID": 1, "Name": null, "ExGuid": "9345E846-42B7-4811-9C0A-DE45257930FE", "Parent": 0, "Remark": "", "Url": "" };
        Ext.Ajax.request({
            url: '/service/defaultservice.svc/DoWork',
            //params: {},
            jsonData: webpost,
            method: 'POST',
            success: function(response, options) {
                var responseArray = Ext.util.JSON.decode(response.responseText);
                if (responseArray != null) {
                    Ext.Msg.alert('信息', response.responseText, true);
                }
                else {
                    Ext.Msg.alert('失败', '调用失败');
                }
            },
            failure: function(conn, response, options) {
                Ext.Msg.alert('失败', conn.statusText);
            }
        });
    -----------------------------------------------------华丽的分隔线--------------------------------------------------------------
    也总结下,(代码环境:visual studio 2008,.NET3.5,EXT3.0)
    1,新建ASP.NET WEB应用程序,添加EXT目录
    2,新建"启用了AJAX的WCF服务",添加相关的特性类,代码看下来类似如下
    namespace wcf2.Service {
        [ServiceContract( Namespace = "" )]
        [AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed )]
        public class DefaultService {
    
            [OperationContract, WebInvoke( Method = "POST", ResponseFormat = WebMessageFormat.Json )]
            public IList<BA_MenuEntity> DoWork( BA_MenuEntity e ) {
                return BA_MenuBLL.Singleton.Select( new BA_MenuEntity() { Parent = 0 } );
            }
    
            [OperationContract, WebInvoke( Method = "POST", ResponseFormat = WebMessageFormat.Json )]
            public string GetMenu() {
                return "HELLO WORLD!";
            }
        }
    }
    3,EXT调用WCF进行测试
    最后也有个疑问:
    WCF返回JSON,怎么再具体操作它返回的一些数据?如下代码所示:那个"d"是干嘛滴?怎么配置成别的名称?服务器端返回的类型为IList<BA_MenuEntity>,还有那个"__type":"BA_MenuEntity:#Tstring.Core.Entity",
    {"d":[{"__type":"BA_MenuEntity:#Tstring.Core.Entity","CnName":"信息发布","EnName":"Information","ExGUID":null,"ExInclude":false,"ExReamrk":null,"Ext":null,"ID":1,"Name":null,"ExGuid":"9345E846-42B7-4811-9C0A-DE45257930FE","Parent":0,"Remark":"","Url":""}]}
    -----------
    2009-10-22后记
    知道那个“d”是干嘛滴了,不过一直没有更新,为了以后复习,备注在此
            [OperationContract( Name = "DoWork4" )]
            [WebInvoke(
                Method = "POST",
                BodyStyle = WebMessageBodyStyle.Wrapped,
                RequestFormat = WebMessageFormat.Json,
                ResponseFormat = WebMessageFormat.Json,
                UriTemplate = "/DoWork4" )]
            [return: MessageParameter( Name = "e" )]
            public Person DoWork4( [MessageParameter( Name = "e" )] Person e ) {
                // 在此处添加操作实现
                return new Person() { Age = 100, Name = "远始天尊" };
            }
    加重的两行,[return: MessageParameter( Name = "e" )]这一行影响返回JSON对象时的名称,就是传说中的"d",此时被声明为"e"了
    后一行        public Person DoWork4( [MessageParameter( Name = "e" )] Person e ) {
    这个影响的是方法接收JSON对象的参数名称,也被改为"e"了,呵呵
  • 相关阅读:
    PICT安装及使用
    Linux 压缩和解压缩常用命令
    ICTCLAS 汉语词性标注集
    基于MPI的并行计算—矩阵向量乘
    Python 主成分分析PCA
    Python 利用pytesser模块识别图像文字
    华为HG255D路由器使用OH3C进行中大校园网认证
    Kubuntu 使用YaH3C进行中大校园网认证
    PHP 调用Python脚本
    Python 调用百度翻译API
  • 原文地址:https://www.cnblogs.com/kkun/p/1542621.html
Copyright © 2020-2023  润新知