WCF数据表基本概念解读

开发 开发工具
WCF数据表类型在服务契约中的使用,对于大部分初学者来说可能还不是很熟悉。那么今天我们就会针对这一问题,做一个详细介绍。

WCF开发工具中,我们可以通过对此的应用来获得一些技术上的帮助,从而轻松的完成各种功能需求。今天我们就先来看看WCF数据表的相关概念。DataSet以及WCF数据表类型是可序列化的,因而我们可以在服务契约中接收或返回数据表或数据集。

如果服务契约使用了DataSet和DataTable类型,生成的代理文件不会直接使用DataSet和DataTable类型,而是包含DataTable数据契约的定义(只包含DataTable的样式,而不包含任何代码)。但我们可以手工修改这些定义。例如这样的服务契约:

  1. [ServiceContract()]   
  2. public interface IContactManager {   
  3. [OperationContract]   
  4. void AddContact(Contact contact);   
  5. [OperationContract]   
  6. void AddContacts(DataTable contacts);   
  7. [OperationContract]   
  8. DataTable GetContacts(); } 

那么生成的代理文件可能会是这样:

  1. public interface IContactManager {   
  2. [System.ServiceModel.OperationContractAttribute(
    Action="http://tempuri.org/IContactManager/AddContact"
    ReplyAction="http://tempuri.org/IContactManager/AddContactResponse")]   
  3. [System.ServiceModel.XmlSerializerFormatAttribute()]   
  4. void AddContact(Contact contact);   
  5. [System.ServiceModel.OperationContractAttribute(
    Action="http://tempuri.org/IContactManager/AddContacts",
    ReplyAction="http://tempuri.org/IContactManager/AddContactsResponse")]   
  6. [System.ServiceModel.XmlSerializerFormatAttribute()]   
  7. AddContactsResponse AddContacts(AddContactsRequest request);   
  8. [System.ServiceModel.OperationContractAttribute(
    Action="http://tempuri.org/IContactManager/GetContacts",
    ReplyAction="http://tempuri.org/IContactManager/GetContactsResponse")]   
  9. [System.ServiceModel.XmlSerializerFormatAttribute()]   
  10. GetContactsResponse GetContacts(GetContactsRequest request); }  

代理类的定义则如下所示:

  1. [System.Diagnostics.DebuggerStepThroughAttribute()]   
  2. [System.CodeDom.Compiler.GeneratedCodeAttribute
    ("System.ServiceModel", "3.0.0.0")]   
  3. public partial class ContactManagerClient : 
    System.ServiceModel.ClientBase
    <IContactManager>,   
  4. IContactManager { //其余成员略;   
  5. public void AddContact(Contact contact) 
    { base.Channel.AddContact(contact);   
  6. }   
  7. AddContactsResponse IContactManager.AddContacts
    (AddContactsRequest request) {   
  8. return base.Channel.AddContacts(request); }   
  9. public void AddContacts(AddContactsContacts contacts) {   
  10. AddContactsRequest inValue = new AddContactsRequest();   
  11. inValue.contacts = contacts;   
  12. AddContactsResponse retVal = ((IContactManager)(this)).
    AddContacts(inValue); }   
  13. GetContactsResponse IContactManager.GetContacts
    (GetContactsRequest request) {   
  14. return base.Channel.GetContacts(request); }   
  15. public GetContactsResponseGetContactsResult GetContacts() {   
  16. GetContactsRequest inValue = new GetContactsRequest();   
  17. GetContactsResponse retVal = ((IContactManager)(this)).
    GetContacts(inValue);   
  18. return retVal.GetContactsResult; } } 

我们可以手动将AddContacts()与GetContacts()方法修改为:

  1. public void AddContacts(DataTable contacts) {   
  2. AddContactsRequest inValue = new AddContactsRequest();   
  3. inValue.contacts = contacts;   
  4. AddContactsResponse retVal = ((IContactManager)(this)).
    AddContacts(inValue); }   
  5. public DataTable GetContacts() {   
  6. GetContactsRequest inValue = new GetContactsRequest();   
  7. GetContactsResponse retVal = ((IContactManager)(this)).
    GetContacts(inValue);   
  8. return retVal.GetContactsResult; } 

当然,前提条件是我们需要修改AddContactRequest类以及GetContactsResponse,例如将AddContactRequest类的contacts成员由原来的AddContactsContacts类型修改为DataTable类型;将GetContactsResponse中的GetContactsResult成员由原来的GetContactsResponseGetContactsResult类型修改为WCF数据表类型。

自动生成的代理类非常复杂,实际上我们完全可以简化。首先将客户端的服务契约定义修改为与服务端服务契约完全一致的定义:

  1. [ServiceContract()]   
  2. public interface IContactManager {   
  3. [OperationContract]   
  4. void AddContact(Contact contact);   
  5. [OperationContract]   
  6. void AddContacts(DataTable contacts);   
  7. [OperationContract] DataTable GetContacts(); } 

然后修改代理类ContactManagerClient:

  1. public partial class ContactManagerClient : System.ServiceModel.
    ClientBase
    <IContactManager>,   
  2. IContactManager {   
  3. public void AddContact(Contact contact) { base.Channel.
    AddContact(contact); }   
  4. public void AddContacts(DataTable contacts) 
    { base.Channel.AddContacts(contacts); }   
  5. public DataTable GetContacts() {   
  6. return base.Channel.GetContacts();   
  7. } } 

以上就是对WCF数据表类型的相关概念。

【编辑推荐】

  1. WCF实现SOA相关操作步骤详解
  2. WCF体系架构基本概念解读
  3. WCF服务契约基本应用技巧解读
  4. WCF限流操作实际设置方式揭秘
  5. WCF实例停用基本应用技巧分享
责任编辑:曹凯 来源: IT168
相关推荐

2010-03-01 16:25:07

WCF体系架构

2009-12-22 10:16:54

WCF服务状态

2009-12-21 10:27:52

WCF基本概念

2010-02-23 16:32:29

WCF服务

2010-03-01 14:50:30

WCF行为类型

2010-03-01 18:04:35

WCF配置绑定

2009-12-21 15:33:07

WCF集合元素

2010-03-02 13:14:38

WCF MSMQ队列

2010-02-24 17:17:04

WCF宿主环境

2010-03-02 16:22:31

WCF状态应用

2009-12-21 16:52:02

WCF序列化

2009-12-21 14:37:14

2010-02-25 14:46:31

2010-03-02 11:10:43

WCF标准终结点

2010-03-01 17:57:11

WCF缓存机制

2010-01-25 10:57:57

Android系统应用

2010-07-02 11:48:30

RS-232C协议

2011-03-28 11:05:17

ODBC

2009-11-25 14:56:43

2014-04-16 15:11:19

Spark
点赞
收藏

51CTO技术栈公众号