wcf已知类型 known type

1.服务契约的定义
/* Copyright (c) 2014 HaiHui Software Co., Ltd. All rights reserved
 *
 * Create by  [email protected] at 2014-10-14 10:09:00
 *
 */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using Framework;
using System.Collections;
using Contract.Domain;

namespace Contract.IService
{

    ///<summary>
    ///协议内容 Interface
    ///</summary>
    [ServiceKnownType("GetKnownTypes", typeof(Framework.IService.KnownTypesProvider))]
    [ServiceContract]
    public interface IBasAgreementService : IEntityService<BasAgreement>
    {

    }

}
2.数据提供者 provider 解析的作用,你就知道哪些东西是属于服务的范畴,哪些属于数据的范畴
#if !NET_2_0
using System;
using System.Collections.Generic;
using System.Reflection;
using System.Runtime.Serialization;

namespace Framework.IService
{
    public static class KnownTypesProvider
    {
        static object syncObj = new object();
        public static Type[] GetKnownTypes(ICustomAttributeProvider attributeTarget)
        {
            //get contract types from service assembly:DataContractAttribute="Contract.IService.ITestService"
            Type serviceContractType = (Type)attributeTarget;
            Assembly callerAssembly = serviceContractType.Assembly;

            if (KnowAssemblys.Count == 0)//First Init
                LoadAppDomainTypes();
            GetTypeFromAssembly(callerAssembly);
            return KnowTypes.ToArray();
        }

        public static Type[] GetKnownTypes()
        {
            Assembly callerAssembly = Assembly.GetCallingAssembly();

            if (KnowAssemblys.Count == 0)//First Init
                LoadAppDomainTypes();
            GetTypeFromAssembly(callerAssembly);
            return KnowTypes.ToArray();
        }

        private static void LoadAppDomainTypes()
        {
            if (KnowAssemblys.Count == 0)//First Init
            {
                //CurrentDomain
                List<Assembly> typeAssemblys = new List<Assembly>();
                Assembly[] domainAssemblys = AppDomain.CurrentDomain.GetAssemblies();
                foreach (Assembly asm in domainAssemblys)
                    if (asm.FullName.IndexOf("Contract") > -1 || asm.FullName.IndexOf("Framework,") > -1 || asm.FullName.IndexOf("Domain")>-1)//IsContract?
                        typeAssemblys.Add(asm);

                //Type serializableType = typeof(SerializableAttribute);
                foreach (Assembly typeAssembly in typeAssemblys)
                {
                    GetTypeFromAssembly(typeAssembly);
                }
            }
        }

        static Type dataContractType = typeof(DataContractAttribute);
        private static void GetTypeFromAssembly(Assembly callerAssembly)
        {
            if (!KnowAssemblys.Contains(callerAssembly.FullName))//Not loaded
            {
                lock (syncObj)
                {
                    if (!KnowAssemblys.Contains(callerAssembly.FullName))//Not loaded(DOUBLE CHECK)
                    {
                        //filter by DataContractAttribute
                        Type[] exportedTypes = callerAssembly.GetExportedTypes();

                        foreach (Type type in exportedTypes)
                            if (Attribute.IsDefined(type, dataContractType, false))// || Attribute.IsDefined(type, serializableType, false))
                                //if (type.Namespace.IndexOf("Contract.")==0)
                                KnowTypes.Add(type);

                        KnowAssemblys.Add(callerAssembly.FullName);
                    }
                }
            }
        }

        private static List<Type> knowTypes;
        private static List<Type> KnowTypes
        {
            get
            {
                if (knowTypes == null)
                {
                    lock (syncObj)
                    {
                        if (knowTypes == null)
                        {
                            knowTypes = new List<Type>();

                            //bug fixed!
                            knowTypes.Add(typeof(string[]));
                            knowTypes.Add(typeof(object[]));
                            knowTypes.Add(typeof(System.Collections.Hashtable));
                            knowTypes.Add(typeof(System.Data.DataSet));
                        }
                    }
                }
                return knowTypes;
            }
        }

        private static List<String> knowAssemblys;
        private static List<String> KnowAssemblys
        {
            get
            {
                if (knowAssemblys == null)
                {
                    lock (syncObj)
                    {
                        if (knowAssemblys == null)
                            knowAssemblys = new List<String>();
                    }
                }
                return knowAssemblys;
            }
        }
    }
}
#endif
时间: 2024-08-11 19:43:32

wcf已知类型 known type的相关文章

C# 序列化过程中的已知类型(Known Type)

WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML.由于类型定义了对象的数据结构,所以无论对于序列化还是反序列化,都必须事先确定对象的类型.如果被序列化对象或者被反序列化生成的对象包含不可知的类型,序列化或者反序列化将会失败.为了确保DataContractSerializer的正常序列化和反序列化,我们需要将“未知”类型加入DataContractSerializer“已知”类型列表中. 一.未知类型导致序列化失败 .NET的类型可以分为两种:声明类型和真实类

WCF中数据契约之已知类型的几种公开方式

WCF中传输的数据不想传统的面向对象编程,它只传递了一些对象的属性,但是自身并不知道自己属于什么对象,所以,他没有子类和父类的概念,因而也就没有Is-a的关系,所以在WCF中,如果想维持这种继承关系,就需要做一些特殊的处理了. 假设有如下定义, namespace KnownTypeExampleInterface{    [DataContract]    public class Employee    {        [DataMember]        public string N

已知json类型根据类型封装集合

1编写帮助类根绝url得到json public static string Post(string url) { string strURL = url; //创建一个HTTP请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(strURL); //Post请求方式 request.Method = "POST"; //内容类型 request.ContentType = "json"; //

windows服务器设置文件属性设置去掉隐藏已知文件类型的扩展名(即文件后缀名可见)

摘要: 1.文件后缀名不可见,系统运维过程容易发生同名不同后缀的文件操作混淆的情况 2.windows系统默认是文件后缀名不可见 3.所以需要更改一下配置. 4.操作步骤如下图: (1)点击组织-文件夹和搜索选项 (2)点击"查看"标签并取消勾选"隐藏已知文件类型的扩展名" 原文链接: http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetail.aspx?EmPreviewTypeV

[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

原文:[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼.百战不殆) [推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) 得到了大家的强力支持与建议,万分感谢.接下来介绍下一篇:oracle pl/sql异常处理部分,还望大家一定

【转】[推荐]ORACLE PL/SQL编程之五:异常错误处理(知已知彼、百战不殆)

[推荐]ORACLE PL/SQL编程之五: 异常错误处理(知已知彼.百战不殆) 继上三篇:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之六:把过程与函数说透(穷追猛打,把根儿都拔起!) [推荐]ORACLE PL/SQL编程之四:把游标说透(不怕做不到,只怕想不到) 得到了大家的强力支持与建议,万分感谢.接下来介绍下一篇:oracle pl/sql异常处理部分,还望大家一定要支持与推荐呀~! 本篇主要内容如下: 5.1 异常处理概念 5.1.1 预定义的异常

Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转)

Delphi 查找标题已知的窗口句柄,遍历窗口控件句柄(转) 用我的方法来控制其他程序窗体上的窗口控件,必须先了解什么是 回调函数.我的理解是这样的: 回 调函数写出来不是自己的程序去调用的,反而是让其他的东西去调用,比如windows操作系统,比如其他的程序等等之类的.但是什么时候被调用却不知道 了.回调函数一般是按照调用者的要求定义好参数和返回值的类型,你向调用者提供你的回调函数的入口地址,然后调用者有什么事件发生的时候就可以随时按照你 提供的地址调用这个函数通知你,并按照预先规定好的形式传

Swift Programming Language ——实例方法(Instance Methods)和类型方法(Type Methods)

方法是与某些特定类型相关联的函数.类.结构体.枚举都可以定义实例方法:实例方法为给定类型的实例封装了具体的任务与功能.类.结构体.枚举也可以定义类型方法:类型方法与类型本身相关联.类型方法与 Objective-C 中的类方法(class methods)相似. 结构体和枚举能够定义方法是 Swift 与 C/Objective-C 的主要区别之一.在 Objective-C 中,类是唯一能定义方法的类型.但在 Swift 中,你不仅能选择是否要定义一个类/结构体/枚举,还能灵活的在你创建的类型

如何过滤出已知当前目录下oldboy中的所有一级目录

第1章 linux启动过程 1.1 linux启动过程(1) 开机自检(BIOS)内存cup是否有问题(硬件检查)(2) MBR引导(3) GRUB菜单(选择不同的内核)(4) 加载内核(kernel)(5) 运行init进程(linux里面的第一个进程,初始化过程)(6) 读取/etc/inittab配置文件(运行级别配置文件)(7) 执行/etc/rc.d/rc.sysinit脚本(系统初始化脚本,设置主机名,设置IP地址)(8) 执行/etc/rc.d/rc脚本(根据系统的云心级别,再开机