WCF筆記 4 訊息協定

2021-06-16 10:32:26 字數 2154 閱讀 6706

一、訊息協定和資料協定的定義方式相同,為類新增訊息協定特性(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 的訊息。輸出 ...