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

推荐订阅源

MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
H
Help Net Security
雷峰网
雷峰网
V
Visual Studio Blog
G
Google Developers Blog
Microsoft Azure Blog
Microsoft Azure Blog
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
IT之家
IT之家
Engineering at Meta
Engineering at Meta
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
M
MIT News - Artificial intelligence
月光博客
月光博客
A
About on SuperTechFans
B
Blog RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
J
Java Code Geeks
云风的 BLOG
云风的 BLOG
Blog — PlanetScale
Blog — PlanetScale

博客园 - 斧头帮少帮主

猜一猜,会输出什么? ASP.NET错误处理的两种方案_AX Log4Net最简单的使用配置_AX 一个修改后的JS日历(Calendar)控件_AX - 斧头帮少帮主 - 博客园 页面回传(PostBack)后恢复滚动条的位置_AX - 斧头帮少帮主 - 博客园 Hidden Field 的值不能回传(PostBack)到后台_AX Delegate(代理)异常:该委托必须有一个目标 WCF学习随笔6--Version变更--我们在前进_AX WCF学习随笔5--我知道:Known--可憐的孩子_AX WCF学习随笔3--第一个Sample--祭斧_AX - 斧头帮少帮主 - 博客园 WCF学习随笔2--Contract--磨斧_AX WCF学习随笔1--扫盲--磨斧_AX 把项目运行情况写入系统日志(Log)的三种方法【续】_AX 把项目运行情况写入系统日志(Log)的三种方法_AX 为用户控件User Control添加事件_AX XML常用操作总结_AX DataTable常用操作总结_AX - 斧头帮少帮主 - 博客园 .NET(C#)代码性能优化_AX - 斧头帮少帮主 - 博客园 Panel的不足及弥补_AX - 斧头帮少帮主 - 博客园
WCF学习随笔4--契约|序列化详解--祭斧_AX
斧头帮少帮主 · 2008-03-17 · via 博客园 - 斧头帮少帮主

添加一个WCF文件,会自动生成两个文件,一个cs后缀一个svc后缀.
cs后缀为对接口的定义.
svc后缀为实现接口的服务.
下面的代码为对接口的定义,代码中对契约和序列化进行了详细解释.

注意:客户端在创建完服务器端的对象时,不会对属性进行赋值.
即跟属性对应的变量赋值语句不会被执行(已跟踪).【不知道为什么???】

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfService_AX
{
    
//【服务契约】
    
//(可重新命名,默认为相关接口或方法名)  
    [ServiceContract(Name = "ServiceName")]
    
public interface IService_AX
    
{
        
//可操作的方法的契约
        [OperationContract(Name = "OperationA")]
        
string DoWork();
        [OperationContract]
        
string OperateSerializableType(A a);
        [OperationContract]
        B OperateDataContractType(B b);
        
//参数通过Channel传递Message,返回类型必须与参数一致
        [OperationContract]
        C OperateMessageType(C c);
    }



    
//--------复杂对象序列化--------
    
//1.使用Serializable属性.
    
//该类可以被序列化,不论可访问性如何
    
//无法对命名规范或数据类型进行控制
    [Serializable]
    
public class A
    
{
        
private int i;
        
public string j;
        
private DateTime k;
    }



    
//2.使用DataContract属性.
    
//【数据契约】
    
//★★★★★★变量赋完初值在客户端会丢失,Why?★★★★★★
    
//能明确成员是否参与序列化
    
//应用与域或属性
    [DataContract]
    
public class B
    
{
        
//Name:Client端看到的Name
        
//IsRequired:是否允许为空
        
//Order:在数据包中与其它成员的相对位置
        [DataMember(Name = "AX", IsRequired = false, Order = 0)]
        
private int i = 1;
        [DataMember]
        
private string name = "My name is AX.";

        [DataMember]
        
public string Name
        
{
            
get
            
{
                
return name;
            }

            
set
            
{
                name 
= value;
            }

        }

        
//在构造中赋初值也不行,到Client端会丢失
        public B()
        
{
            name 
= "Construct";
        }

    }


    
//3.实现IXmlSerializable接口
    
//手动编写XML信息
    
//(不实用,很少有这种需求,所以没有例子)
    
//-------------------------------------------------

    
//【消息契约】
    
//可以指定成员放在消息的head或body中
    
//添加自定义头
    
//控制消息是否被包装
    
//控制签名或加密
    [MessageContract(IsWrapped=true,ProtectionLevel=System.Net.Security.ProtectionLevel.Sign)]
    
public class C
    
{
        
private int i=5;
        [MessageHeader]
        
public int MyProperty
        
{
            
get
            
{
                
return i;
            }

            
set
            
{
                i 
= value;
            }

        }


        [MessageBodyMember]
        
public int Item;
    }


}

实现接口的服务代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WcfService_AX
{
    
public class Service_AX : IService_AX
    
{
        
public string DoWork()
        
{
            
return "Hello World!";
        }



        
public string OperateSerializableType(A a)
        
{
            a.j 
= "OK";
            
return "You load the Method:OperateSerializableType--Parameter type is " + a.GetType().ToString() + a.j;
        }



        
public B OperateDataContractType(B b)
        
{
            b.Name 
+= "--Operation has complished!--";
            
return b;
        }


        
public C OperateMessageType(C c)
        
{
            c.MyProperty
++;
            
return c;
        }


    }

}


客户端调用代码(不会调用的见上篇)

    protected void Page_Load(object sender, EventArgs e)
    
{
        SR.ServiceName proxy 
= new SR.ServiceNameClient();
        Response.Write(proxy.OperationA()
+"<br/>");

        SR.A a 
= new SR.A();
        a.j 
= "Hi";
        Response.Write(proxy.OperateSerializableType(a) 
+ "<br/>");


        SR.B b 
= new SR.B();
        Response.Write(b.name1
+"<br/>");
        Response.Write(b.Name 
+ "<br/>");
        Response.Write(proxy.OperateDataContractType(b).Name 
+ "<br/>");


        SR.C c 
= new SR.C();
        Response.Write(c.MyProperty.ToString()
+"<br/>");
        Response.Write(proxy.OperateMessageType(c).MyProperty.ToString() 
+ "<br/>");
    }

其中有意思的是name变量变成了name1,元数据为

namespace SR
{
    [Serializable]
    [DebuggerStepThrough]
    [GeneratedCode(
"System.Runtime.Serialization""3.0.0.0")]
    [DataContract(Name 
= "B", Namespace = "http://schemas.datacontract.org/2004/07/WcfService_AX")]
    
public class B : IExtensibleDataObject, INotifyPropertyChanged
    
{
        
public B();

        [DataMember(Order 
= 2)]
        
public int AX getset; }
        
public ExtensionDataObject ExtensionData getset; }
        [DataMember]
        
public string Name getset; }
        [DataMember(Name 
= "name")]
        
public string name1 getset; }

        
public event PropertyChangedEventHandler PropertyChanged;

        
protected void RaisePropertyChanged(string propertyName);
    }

}

输出结果

Hello World!
You load the Method:OperateSerializableType--Parameter type is WcfService_AX.AOK

--Operation has complished!--
0
1