惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

WordPress大学
WordPress大学
The GitHub Blog
The GitHub Blog
F
Fortinet All Blogs
Cloudbric
Cloudbric
P
Palo Alto Networks Blog
T
Threatpost
T
Tor Project blog
T
Tenable Blog
AWS News Blog
AWS News Blog
Project Zero
Project Zero
L
LangChain Blog
Cyberwarzone
Cyberwarzone
Engineering at Meta
Engineering at Meta
雷峰网
雷峰网
C
CERT Recently Published Vulnerability Notes
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Security Latest
Security Latest
云风的 BLOG
云风的 BLOG
I
Intezer
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Proofpoint News Feed
A
Arctic Wolf
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Google DeepMind News
Google DeepMind News
V
Vulnerabilities – Threatpost
C
Cybersecurity and Infrastructure Security Agency CISA
MongoDB | Blog
MongoDB | Blog
aimingoo的专栏
aimingoo的专栏
K
Kaspersky official blog
Jina AI
Jina AI
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
D
DataBreaches.Net
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
Recorded Future
Recorded Future
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
S
Secure Thoughts
TaoSecurity Blog
TaoSecurity Blog
P
Privacy & Cybersecurity Law Blog
P
Proofpoint News Feed
MyScale Blog
MyScale Blog
IT之家
IT之家
Forbes - Security
Forbes - Security
The Hacker News
The Hacker News
Last Week in AI
Last Week in AI
T
Threat Research - Cisco Blogs
Y
Y Combinator Blog

博客园 - 大约在冬季

如何在IronPython中使用C#扩展方法 LINQ入门教程示例使用F#的实现 宝宝照片更新喽 再谈两种不同字符串比较方法的性能对比 - 大约在冬季 - 博客园 如何让DevExpress.TreeList单元格中的自定义控件包含标签 见证中国A股市场:上午大盘加速寻底 沪指跌129点,探低至4241.02 漂亮宝宝100天啦!庆祝一下! F# 学习笔记(1/n) 权重股杀跌沪指半日破两关跌135点 IronPyton分析表达式 最近性能优化一些感触,分享中…… 两种不同字符串比较方法的性能对比 .Net 事件类型的实现和推荐做法 设计时支持:如何获取环境数据 如何在C#中调用 IronPython 代码 (基于IronPython 2.0A3) 运行Oracle数据库配置向导创建数据库失败ORA-24324的解决方案 C#3.0 自动属性——只能在简单属性上偷懒 性能——换个角度看问题 设计模式的滋味
WCF服务契约 听课笔记
大约在冬季 · 2007-09-27 · via 博客园 - 大约在冬季

  WCF 服务契约 听课笔记

服务契约

服务契约定义了向外部暴露的行为,它既可以应用于接口也可以应用于具体的类。但是考虑到某些类可能会实现多个接口如果定义在Class上,就只能实现一种契约,此外Class是易变的,而Interface是相对稳定的,所以最好把服务契约定义在Interface上。如果标记了ServiceContractAttribute那么在内部域中必须包含或者说是至少包含一个操作契约(OperateContractAttribute)标记。

在服务契约中,通过指定Name属性可以改变在客户端使用的类型名称。

在方法签名中使用MesageParameterAttribute,例如:

void SaveLinkItem([MessageParameter(Name = “EasyFlowLinkItem”)] LinkItem item)

使用这种标记后,在客户端通过代理调用时方法的参数将是EasyFlowLinkItem而不是item. 尤其在多个系统交互时,可能方法的参数名称不同,通过这个属性完成SOAP消息中方法参数的映射,在从客户端发送到服务端后,WCF将完成这个名称的映射。

标记为服务契约的接口或类是不具备一些OO特性的,例如继承性和多态。

数据契约

数据契约在功能上可以认为是同于SerialzableAttributeIxmlSerializable的,都表示支持XML序列化,以便能够封送SOAP消息(XML+XSD)在客户端和服务器端往返。

当类被标记为可XML序列化后,在整个域内部不论可访问性如何都被认为是可被序列化的。

数据契约在定义中应该按照W3C的规范在Namespace属性值中加上schema前缀。

两个常用属性 IsRequired 表示在序列化之前必须被赋值,Order属性表示按照制定的顺序生成节点。如果没有指定,则按照字符表顺序生成。

数据契约标记应该在属性上声明,而不应该在内部字段上使用。否则就不符合OO的设计原则。

应用KnownType属性。

[ServiceContract]

    public interface LinkTestService {

        [OperationContract]

        void SomeMehtod(LinkItem item);

    }

    [DataContract]

    [KnownType(typeof(LinkItemA))]

    public class LinkItem {

        [DataMember]

        public string Id;

    }

    [DataContract]

    public class LinkItemA : LinkItem {

        [DataMember]

        public string Location;

    }

LinkItem中如果没有标记KnownTypeAttribute,那么在客户端调用LinkTestService.SomeMethod方法的时候,如果传入了LinkItemAWCF是服务识别的。注意派生类中也应该标记DataMember。定义标记的方式可以有两种,一种是通过如上图所示的代码方式,另外一种是在Host中使用配置文件。

除此之外,还可以使用ServiceKownTypeAttribute标记的服务契约上,指明在序列化和反序列化时可以识别的类型。还可以把ServiceKnownType标记在方法上,进一步限定只有标记这这些属性的方法可以使用派生类型。

消息契约

提供对自定义SOAP message的支持

允许添加自定义Header

控制消息是否被包装

控制签名和加密

MessageHeaderAttributeMessageBodyAttribute 提供对消息头和消息体的控制。他们可以确定那些程序可以被包装在消息头或消息体中。

自定义

         在实际的开发中常常面临多个产品或系统集成的问题,由于早期并没有考虑到集成所以在设计上可能会遇到一些无法直接序列化的对象。对于这些对象需要自定义的实现IXmlSerializable方法并标记XmlSchemaProviderAttribute

         通过IXmlSerializableReadXmlWriteXmlWSDL和元数据交换ImetaDataExchange提供可识别的XSD。假设LinkItem不支持直接序列化,那么通过在服务端定义LinkItemSerializer新的对象,实现自定义序列化工作。

[XmlSchemaProvider("GetSchema")]

    public class LinkItemSerializer:IXmlSerializable {

        public string Id;

        #region IXmlSerializable 成员

        public System.Xml.Schema.XmlSchema GetSchema() {

            //TODO

        }

        public void ReadXml(System.Xml.XmlReader reader) {

            //TODO

        }

        public void WriteXml(System.Xml.XmlWriter writer) {

            //TODO

        }

        #endregion

    }

这些更改不会影响到客户端的调用方式,客户端仍然使用原来的LinkItem进行传递。