一、訊息協定和資料協定的定義方式相同,為類新增訊息協定特性(messagecontract),這樣我們就可以定義乙個訊息協定類了
二、示例**
/// /// 資料協定類(藝術品資訊)
///
[datacontract]
public class artinfo
/// /// 創作時間
///
[datamember]
public datetime createtime
}/// /// 訊息協定類(藝術家)
///
[messagecontract]
public class artist
/// /// 年齡
///
[messagebodymember]
public int age
/// /// 作品資訊
///
[messagebodymember]
public artinfo artinfo
}
服務端
class program
);//啟動服務
trycatch (exception ex)
console.readkey();
//關閉服務
host.close();}}
}/// /// 定義服務協定
///
[servicecontract]
public inte***ce iservice
/// /// 實現服務協定
///
public class myservice : iservice
", artist.name);
console.writeline("年齡:", artist.age);
console.writeline("--------作品資訊------");
artinfo artinfo = artist.artinfo;
console.writeline("作品名稱:", artinfo.artname);
("yyyy年mm月dd日hh時mm分ss秒")); }}
服務啟動後我們在客戶端新增服務引用,新增服務引用後我們可以看到我們在服務端定義的方法發生了變化
客戶端
using system;
namespace client
;
/*呼叫服務端方法設定藝術家資訊(注意這裡的"setartistinfo"方法)
已經和我們在服務端定義的方法不一樣了:client.ws.serviceclient.setartistinfo(string, int, client.ws.artinfo)
原來服務端: void setartistinfo(artist artist);方法
這說明定義為"訊息協定的類"在當做傳入引數的時候,它內部定義為訊息體和訊息頭的成員都被拆開了
訊息體和訊息頭的區別:定義為"訊息頭的成員"在拆分的時候會被拆分成該方法的第乙個引數
如我們定義的:[messageheader] public string name ,
最後在客戶端我們看到public void setartistinfo(string name, int age, client.ws.artinfo artinfo)
*/sc.setartistinfo("老鬼", 55, artinfo);
console.readkey();}}
}
需要特別注意的:
a、訊息協定作為傳入引數,則只能有乙個引數,以下定義是錯誤的:
void reconcile(bankingtransaction bt1, bankingtransaction bt2);
b、除非你返回值為void,如不是,那你必須返回乙個訊息協定,bool uploadfile(transferfilemessage tmsg)我們這個定義明顯不符合要求。
WCF筆記 2 資料協定
一 使用資料協定的好處 1 使用資料協定可以靈活控制哪些成員應該被客戶端識別。2 隱藏真實身份 給類或成員取別名 二 示例 1 服務端 定義實現資料協定的類 using system using system.collections.generic using system.linq using s...
WCF資料協定
今天還是按部就班的開始在msdn裡面翻找wcf的資料。先從定義開始吧。看著下面這些 我貌似發現乙個東西,那就是帶有 datamember 標籤的方法都是可以給客戶端開放使用的,不帶有的客戶端就不給用,好像就是這樣的。datacontract namespace internal class reco...
WCF 學習筆記 4 訊息操作
wcf 的一切都是圍繞著 message 進行,那麼 message 究竟是什麼樣子?輸出http localhost 8080 calc 事實上我們可以直接基於 message layer 進行程式設計,利用 operationcontract.action 捕獲特定 action 的訊息。輸出 ...