WCF數據表基本概念解讀
在WCF開發工具中,我們可以通過對此的應用來獲得一些技術上的幫助,從而輕松的完成各種功能需求。今天我們就先來看看WCF數據表的相關概念。DataSet以及WCF數據表類型是可序列化的,因而我們可以在服務契約中接收或返回數據表或數據集。
如果服務契約使用了DataSet和DataTable類型,生成的代理文件不會直接使用DataSet和DataTable類型,而是包含DataTable數據契約的定義(只包含DataTable的樣式,而不包含任何代碼)。但我們可以手工修改這些定義。例如這樣的服務契約:
- [ServiceContract()]
- public interface IContactManager {
- [OperationContract]
- void AddContact(Contact contact);
- [OperationContract]
- void AddContacts(DataTable contacts);
- [OperationContract]
- DataTable GetContacts(); }
那么生成的代理文件可能會是這樣:
- public interface IContactManager {
- [System.ServiceModel.OperationContractAttribute(
Action="http://tempuri.org/IContactManager/AddContact",
ReplyAction="http://tempuri.org/IContactManager/AddContactResponse")]- [System.ServiceModel.XmlSerializerFormatAttribute()]
- void AddContact(Contact contact);
- [System.ServiceModel.OperationContractAttribute(
Action="http://tempuri.org/IContactManager/AddContacts",
ReplyAction="http://tempuri.org/IContactManager/AddContactsResponse")]- [System.ServiceModel.XmlSerializerFormatAttribute()]
- AddContactsResponse AddContacts(AddContactsRequest request);
- [System.ServiceModel.OperationContractAttribute(
Action="http://tempuri.org/IContactManager/GetContacts",
ReplyAction="http://tempuri.org/IContactManager/GetContactsResponse")]- [System.ServiceModel.XmlSerializerFormatAttribute()]
- GetContactsResponse GetContacts(GetContactsRequest request); }
代理類的定義則如下所示:
- [System.Diagnostics.DebuggerStepThroughAttribute()]
- [System.CodeDom.Compiler.GeneratedCodeAttribute
("System.ServiceModel", "3.0.0.0")]- public partial class ContactManagerClient :
System.ServiceModel.ClientBase<IContactManager>,- IContactManager { //其余成員略;
- public void AddContact(Contact contact)
{ base.Channel.AddContact(contact);- }
- AddContactsResponse IContactManager.AddContacts
(AddContactsRequest request) {- return base.Channel.AddContacts(request); }
- public void AddContacts(AddContactsContacts contacts) {
- AddContactsRequest inValue = new AddContactsRequest();
- inValue.contacts = contacts;
- AddContactsResponse retVal = ((IContactManager)(this)).
AddContacts(inValue); }- GetContactsResponse IContactManager.GetContacts
(GetContactsRequest request) {- return base.Channel.GetContacts(request); }
- public GetContactsResponseGetContactsResult GetContacts() {
- GetContactsRequest inValue = new GetContactsRequest();
- GetContactsResponse retVal = ((IContactManager)(this)).
GetContacts(inValue);- return retVal.GetContactsResult; } }
我們可以手動將AddContacts()與GetContacts()方法修改為:
- public void AddContacts(DataTable contacts) {
- AddContactsRequest inValue = new AddContactsRequest();
- inValue.contacts = contacts;
- AddContactsResponse retVal = ((IContactManager)(this)).
AddContacts(inValue); }- public DataTable GetContacts() {
- GetContactsRequest inValue = new GetContactsRequest();
- GetContactsResponse retVal = ((IContactManager)(this)).
GetContacts(inValue);- return retVal.GetContactsResult; }
當然,前提條件是我們需要修改AddContactRequest類以及GetContactsResponse,例如將AddContactRequest類的contacts成員由原來的AddContactsContacts類型修改為DataTable類型;將GetContactsResponse中的GetContactsResult成員由原來的GetContactsResponseGetContactsResult類型修改為WCF數據表類型。
自動生成的代理類非常復雜,實際上我們完全可以簡化。首先將客戶端的服務契約定義修改為與服務端服務契約完全一致的定義:
- [ServiceContract()]
- public interface IContactManager {
- [OperationContract]
- void AddContact(Contact contact);
- [OperationContract]
- void AddContacts(DataTable contacts);
- [OperationContract] DataTable GetContacts(); }
然后修改代理類ContactManagerClient:
- public partial class ContactManagerClient : System.ServiceModel.
ClientBase<IContactManager>,- IContactManager {
- public void AddContact(Contact contact) { base.Channel.
AddContact(contact); }- public void AddContacts(DataTable contacts)
{ base.Channel.AddContacts(contacts); }- public DataTable GetContacts() {
- return base.Channel.GetContacts();
- } }
以上就是對WCF數據表類型的相關概念。
【編輯推薦】