前兩章分別講了Socket的數據傳輸,本章開始將在前兩章的基礎上構建一個消息傳輸機制.
因為服務端和客戶端都離不開消息的傳輸,所以先講如何在前兩章的基礎上構建消息傳輸的信道,本例構造了一個類MessageSession,該類負責消息在網絡中傳送,並且該類實現了一個接口IMessageSession,其目的同前一章實現接口的目的一樣,都是為了方便以后的擴展,該類的主要傳輸主體為一個接口IMessage,可以說這是一個消息調用的接口,是為了遠程調用而定義的一個接口,本篇中先給出它的接口定義,其實現在后續章節中給出
IMessage接口的定義如下:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace YZKStdLibrary.Message
7 {
8 /// <summary>
9 /// 消息接口
10 /// </summary>
11 public interface IMessage
12 {
13 /// <summary>
14 /// 在服務進程中的消息唯一ID
15 /// </summary>
16 long MessageID { get; }
17 /// <summary>
18 /// 獲取登錄憑證,該憑證為經過服務端驗證的唯一標識
19 /// </summary>
20 string LoginedAuthentication { get; }
21 /// <summary>
22 /// 獲取調用成員名稱或Guid
23 /// </summary>
24 string InvokeMemberGuid { get; }
25 /// <summary>
26 /// 獲取處理該消息的服務類標識,使用該標識確定是哪個服務類處理該消息
27 /// </summary>
28 string ServiceGuid { get; }
29 /// <summary>
30 /// 獲取處理該消息的程序集
31 /// </summary>
32 string AssemblyGuid { get; }
33 /// <summary>
34 /// 消息參數數組
35 /// </summary>
36 object[] Paramets { get; }
37 }
38 }
同時還定義了一個傳輸進度的回調代理OnTransingCallback:

1 /// <summary>
2 /// 傳輸進度回調
3 /// </summary>
4 /// <param name="transesize">要傳輸的數據的字節數</param>
5 /// <param name="tranfferedbytes">已傳輸的字節數</param>
6 /// <param name="message">傳輸的消息</param>
7 /// <param name="transedirection">傳輸方向</param>
8 public delegate void OnTransingCallback(long transesize, long tranfferedbytes, IMessage message, DataTranseDirection transedirection);
該類定義了三個異步傳輸方法,由於使用IAsyncResult的返回機制,所以沒有定義同不方法,要同步只需等待返回的完成信號即可,當然你也可以定義同步方法,這個在前一章的同步方法上構建比教簡單,有興趣的網友可以自己試試.三個異步傳輸方法分別是BeginTranseMessage,BeginSendMessage,BeginReceiveMessage,同時它們都對應一個結束方法EndTranseMessage,EndSendMessage,EndReceiveMessage,下面分別先說一下這三個方法的用途.
BeginTranseMessage:一般使用在客戶端操作,也就是使用在發送完數據並且等待響應數據的應用場景下,大家可以想一下,客戶端的調用一般都是一發一收的,即使是過程調用沒有返回數據你也應該返回一個調用結束的消息通知調用方是否成功調用或返回一個錯誤通知錯誤信息.
BeginSendMessage和BeginReceiveMessage;一般使用在服務端,也就是在先接收消息再返回消息響應的應用場景下.
下面講一下這三個方法:
BeginTranseMessageCore:先獲取參數ITranseParamets,並將它設置成發送的狀態,再設置傳輸時使用的流類型SR_StreamTypeEnum,然后開始數據傳輸,這里就涉及到接口ITranseParamets的實現類MessageTranseParamets
這個類在三個異步傳輸方法中都要用到,因此先講講這個類:MessageTranseParamets
SR_StreamType屬性:定義傳輸流的類型
WaitReceiveMessage屬性:定義是否等待消息響應
AsyncResult屬性:一個IAsyncResult接口的實現
p_Serialize變量:一個序列化接口的對象,該序列化接口是自定義的,當然也可以使用MS本身的序列化
p_BufferIndexe變量:這是一個使用的緩沖區索引的結構,該結構的目的是指明使用的緩沖區的開始索引和長度,由於本例是從一個更大的應用中摘錄的,在該應用中定義了一個緩沖區機制,即所有使用位數組的場景都使用同一個大的位數組,它是一開始就創建好的,使用者通過一些方法獲取它的可用開始索引和長度后使用,本例中的位數組流和傳輸緩沖區都是使用這樣一個機制.至於如何實現請網友們等待后續文章.
g_TempFileName變量:文件流的文件名稱
Message屬性:要發送的消息主體
TransingCallback屬性:傳輸進度回調代理
其它接口的屬性我就不講了,請參看上一章接口的定義.
TranseBuffer,TranseBufferOffset,TranseBufferSize大家先用new byte[]和0,byte[].Length代替
ResetToSendParamets方法:將參數設置成等待發送的狀態,該方法就是初始化發送時的參數,並且調用InitSendMessage方法初始化發送流,流的類型取決於屬性SR_StreamType,對於Auto默任使用位數組流,對於創建位數組流CreateBytesStream方法中的類型BytesBufferStream已說過在后續章節中給出,大家不妨先用CreateBytesStream2使用MemoryStream代替.並且將消息序列化到流中(此時可以根據約定進行加密或壓縮等操作),大家請注意了在InitSendMessage方法中最后設置了傳輸約定中的ITranseHeader.TranseSize和傳輸流的位置
ResetToRcvParamets方法:將參數設置成等待接收的狀態.
ChangeToRcvParamets方法:將參數送發送狀態轉為接收狀態
ResetToConnectParamets方法:將參數設置成連接狀態
HeaderTransed方法:該方法是接口中定義的方法,用於通訊模塊通知本接口約定已傳輸完成,在前一章中使用到本方法,
在該方法中首先將約定已傳輸標識置位,並且如果是接收操作則根據約定初始化接收流,接收流的初始化也是根據SR_StreamType屬性創建的,所以發送和接收雙方都應該使用同一個SR_StreamType的值.同樣在沒有給出BytesBufferStream流的定義之前,大家先用MemoryStream代替
AsyncTranseOver方法:該方法是接口中定義的方法,用於通訊模塊通知本接口數據主體已傳輸完成,在前一章中使用到本方法,在該方法中如果是連接則直接調用連接完成的回調就完事,如果是接收則反序列化對象(此時可以根據約定進行解密或解壓等操作),最后完成傳輸(調用MessageSession.FinshSession方法)
AsyncNotyTransing:該方法是接口中定義的方法,用於通訊模塊通知本接口約定已傳輸完成,在前一章中使用到本方法,用於接收傳輸進度的通知,本例只是簡單調用OnTransingCallback回調(如果不為null的話)就完事,
以下為該類的定義:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using YZKStdLibrary.Network.Transe;
6 using System.Net;
7 using System.Threading;
8 using System.IO;
9 using System.IO.MemoryMappedFiles;
10 using YZKStdLibrary.IO;
11 using YZKStdLibrary.Serialize;
12
13 namespace YZKStdLibrary.Message.Channel
14 {
15 internal class MessageTranseParamets : ITranseParamets
16 {
17
18 public MessageTranseParamets()
19 {
20 p_TranseHeader = new TranseHeader();
21 p_AsyncResult = new MessageSessionAsyncResult(null, null);
22 p_SR_StreamType = SR_StreamTypeEnum.Auto;
23 }
24
25 private SR_StreamTypeEnum p_SR_StreamType;
26
27 public SR_StreamTypeEnum SR_StreamType
28 {
29 get { return p_SR_StreamType; }
30 set { p_SR_StreamType = value; }
31 }
32
33 private bool p_WaitReceiveMessage;
34
35 public bool WaitReceiveMessage
36 {
37 get { return p_WaitReceiveMessage; }
38 }
39
40 private MessageSession g_Owner;
41
42 private MessageSessionAsyncResult p_AsyncResult;
43
44 internal MessageSessionAsyncResult AsyncResult
45 {
46 get { return p_AsyncResult; }
47 }
48
49 private IFormattSerialize p_Serialize;
50
51 private BufferIndexHandle p_BufferIndexe;
52
53 private string g_TempFileName;
54
55 private void DeleteTempFile()
56 {
57 if (!string.IsNullOrEmpty(g_TempFileName))
58 {
59 StandHelperMethod.DeleteFile(g_TempFileName);
60 g_TempFileName = null;
61 }
62 }
63
64 private void CloseStream()
65 {
66 if (p_TranseStream != null)
67 {
68 try
69 {
70 p_TranseStream.Close();
71 }
72 catch { }
73 try
74 {
75 p_TranseStream.Dispose();
76 }
77 catch { }
78 p_TranseStream = null;
79 }
80 }
81
82 private void CreateMappFileStream()
83 {
84 g_TempFileName = MessageHelper.GetTempFileName();
85 //MemoryMappedFile mp = MemoryMappedFile.CreateFromFile(g_TempFileName, FileMode.Create, null, 5 * 1024 * 1024);
86 //p_TranseStream = mp.CreateViewStream();
87 //mp.Dispose();
88 p_TranseStream = new FileStream(g_TempFileName, FileMode.Create);
89 }
90
91 private void CreateBytesStream()
92 {
93 p_TranseStream = new BytesBufferStream(MessageHelper.StreamBuffer);
94 }
95
96 private void CreateBytesStream2()
97 {
98 p_TranseStream = new MemoryStream();
99 }
100
101 private IMessage p_Message;
102
103 public IMessage Message
104 {
105 get { return p_Message; }
106 }
107
108 private OnTransingCallback p_TransingCallback;
109
110 public OnTransingCallback TransingCallback
111 {
112 get { return p_TransingCallback; }
113 }
114
115 private bool TrySerializeMessage(IMessage message)
116 {
117 try
118 {
119 p_Serialize.Serialize(p_TranseStream, message);
120 }
121 catch (BytesBufferManagerAssignException)
122 {
123 return false;
124 }
125 catch (Exception e)
126 {
127 p_TranseError = e;
128 }
129 return true;
130 }
131
132 private bool InitSendMessage(IMessage message)
133 {
134 try
135 {
136 switch (p_SR_StreamType)
137 {
138 case SR_StreamTypeEnum.Auto:
139 {
140 CreateBytesStream();
141 if (!TrySerializeMessage(message))
142 {
143 CloseStream();
144 CreateMappFileStream();
145 TrySerializeMessage(message);
146 }
147 break;
148 }
149 case SR_StreamTypeEnum.Bytes:
150 {
151 CreateBytesStream();
152 p_Serialize.Serialize(p_TranseStream, message);
153 break;
154 }
155 case SR_StreamTypeEnum.Files:
156 {
157 CreateMappFileStream();
158 p_Serialize.Serialize(p_TranseStream, message);
159 break;
160 }
161 }
162 }
163 catch (Exception e)
164 {
165 p_TranseError = e;
166 }
167
168 if (p_TranseError != null)
169 return false;
170 p_Message = message;
171 p_TranseHeader.TranseSize = p_TranseStream.Length;
172 p_TranseStream.Seek(0, SeekOrigin.Begin);
173 return true;
174 }
175
176 private void InitReceiveStream()
177 {
178 long x = p_TranseHeader.TranseSize;
179 switch (p_SR_StreamType)
180 {
181 case SR_StreamTypeEnum.Auto:
182 {
183 if (x < MessageHelper.StreamBuffer.TotalBytesCount)
184 {
185 BufferIndexHandle bh;
186 if (x <= 0)
187 bh = MessageHelper.StreamBuffer.TryAssignBufferHandle();
188 else
189 bh = MessageHelper.StreamBuffer.TryAssignBufferHandle((int)x);
190 if (!bh.IsEmpty)
191 {
192 p_TranseStream = new BytesBufferStream(
193 MessageHelper.StreamBuffer,
194 bh,
195 0, true, true, true, true);
196 //((BytesBufferStream)p_TranseStream).InitFixStream();
197 }
198 else
199 CreateMappFileStream();
200 }
201 else
202 {
203 CreateMappFileStream();
204 }
205 break;
206 }
207 case SR_StreamTypeEnum.Bytes:
208 {
209 BufferIndexHandle bh;
210 if (x <= 0)
211 bh = MessageHelper.StreamBuffer.TryAssignBufferHandle();
212 else
213 bh = MessageHelper.StreamBuffer.TryAssignBufferHandle((int)x);
214 if (!bh.IsEmpty)
215 {
216 p_TranseStream = new BytesBufferStream(
217 MessageHelper.StreamBuffer,
218 bh,
219 0, true, true, true,true);
220 //((BytesBufferStream)p_TranseStream).InitFixStream();
221 }
222 break;
223 }
224 case SR_StreamTypeEnum.Files:
225 {
226 CreateMappFileStream();
227 break;
228 }
229 }
230
231 }
232
233 private void DeSerializeRcvMessage()
234 {
235 p_TranseStream.Seek(0, SeekOrigin.Begin);
236 p_AsyncResult.Response =
237 p_Serialize.DeSerialize(p_TranseStream) as IMessage;
238 }
239
240 #region ITranseParamets 成員
241
242 private TranseHeader p_TranseHeader;
243
244 public ITranseHeader TranseHeader
245 {
246 get { return p_TranseHeader; }
247 }
248
249 private Stream p_TranseStream;
250
251 public Stream TranseStream
252 {
253 get { return p_TranseStream; }
254 }
255
256 public byte[] TranseBuffer
257 {
258 get { return MessageHelper.ReadWriteBuffer.Buffer; }
259 }
260
261 public int TranseBufferOffset
262 {
263 get { return p_BufferIndexe.Index; }
264 }
265
266 public int TranseBufferSize
267 {
268 get { return p_BufferIndexe.Count; }
269 }
270
271 private long p_BytesTransferred;
272
273 public long BytesTransferred
274 {
275 get
276 {
277 return p_BytesTransferred;
278 }
279 set
280 {
281 p_BytesTransferred = value;
282 }
283 }
284
285 private bool p_IsAsyncTranse;
286
287 public bool IsAsyncTranse
288 {
289 get { return p_IsAsyncTranse; }
290 set { p_IsAsyncTranse = value; }
291 }
292
293 private DataTranseDirection p_DataTranseDirection;
294
295 public DataTranseDirection DataTranseDirection
296 {
297 get { return p_DataTranseDirection; }
298 }
299
300 private Exception p_TranseError;
301
302 public Exception TranseError
303 {
304 get
305 {
306 return p_TranseError;
307 }
308 set
309 {
310 p_TranseError = value;
311 }
312 }
313
314 private bool p_IsCancel;
315
316 public bool IsCancel
317 {
318 get { return p_IsCancel; }
319 }
320
321 private bool p_HeaderTransedOver;
322
323 public bool HeaderTransedOver
324 {
325 get { return p_HeaderTransedOver; }
326 }
327
328 private EndPoint p_ConnectToEndPoint;
329
330 public EndPoint ConnectToEndPoint
331 {
332 get { return p_ConnectToEndPoint; }
333 }
334
335 private object p_ConnectTranseInterfaceSetting;
336
337 public object ConnectTranseInterfaceSetting
338 {
339 get { return p_ConnectTranseInterfaceSetting; }
340 }
341
342 public void HeaderTransed()
343 {
344 p_HeaderTransedOver = true;
345 if (p_DataTranseDirection == DataTranseDirection.ReceivingData)
346 {
347 InitReceiveStream();
348 }
349 }
350
351 public void AsyncTranseOver()
352 {
353 if (p_DataTranseDirection == Network.Transe.DataTranseDirection.Connecting)
354 {
355 if (p_Cb != null)
356 p_Cb(this);
357 return;
358 }
359 if (p_TranseError == null)
360 {
361 if (p_DataTranseDirection == Network.Transe.DataTranseDirection.ReceivingData)
362 {
363 try
364 {
365 DeSerializeRcvMessage();
366 }
367 catch (Exception e)
368 {
369 p_TranseError = e;
370 }
371 }
372 }
373 if (g_Owner != null)
374 g_Owner.FinshSession(this);
375 }
376
377 public void AsyncNotyTransing()
378 {
379 if (p_TransingCallback != null)
380 p_TransingCallback(p_TranseHeader.TranseSize, p_BytesTransferred, p_Message, p_DataTranseDirection);
381 }
382
383 #endregion
384
385 internal void ResetToNull(bool asyncrest)
386 {
387 CloseStream();
388 DeleteTempFile();
389 MessageHelper.ReadWriteBuffer.RecoveryBufferHandle(p_BufferIndexe);
390 p_BufferIndexe = BufferIndexHandle.Empty;
391 if (asyncrest)
392 p_AsyncResult.ResetToNull();
393 else
394 p_AsyncResult = null;
395 p_Serialize = null;
396 p_BytesTransferred = 0;
397 p_DataTranseDirection = DataTranseDirection.Unkown;
398 p_IsAsyncTranse = false;
399 p_TranseError = null;
400 p_IsCancel = false;
401 p_HeaderTransedOver = false;
402 p_ConnectToEndPoint = null;
403 p_ConnectTranseInterfaceSetting = null;
404 p_TransingCallback = null;
405 p_Message = null;
406 p_TranseHeader.RecyValue();
407 g_Owner = null;
408 p_WaitReceiveMessage = false;
409 p_Cb = null;
410 }
411
412 internal bool ResetToSendParamets(
413 MessageSession owner,
414 IMessage sendmessage,
415 int headerflag,
416 object state,
417 AsyncCallback callback,
418 OnTransingCallback tccbk,
419 bool waitrcvmsg)
420 {
421 g_Owner = owner;
422 p_BufferIndexe = MessageHelper.ReadWriteBuffer.AssignBufferHandle();
423 p_Serialize = CurrentAppConfiger.CurrentErpConfinger.Formattor;
424 if (p_AsyncResult == null)
425 p_AsyncResult = new MessageSessionAsyncResult(state, callback);
426 else
427 p_AsyncResult.Reset(state, callback);
428 p_DataTranseDirection = Network.Transe.DataTranseDirection.SendingData;
429 p_IsAsyncTranse = true;
430 p_TransingCallback = tccbk;
431 p_TranseHeader.TranseFlags = headerflag;
432 p_WaitReceiveMessage = waitrcvmsg;
433 return InitSendMessage(sendmessage);
434 }
435
436 internal void ResetToRcvParamets(
437 MessageSession owner,
438 int headerflag,
439 object state,
440 AsyncCallback callback,
441 OnTransingCallback tccbk)
442 {
443 g_Owner = owner;
444 p_BufferIndexe = MessageHelper.ReadWriteBuffer.AssignBufferHandle();
445 p_Serialize = CurrentAppConfiger.CurrentErpConfinger.Formattor;
446 if (p_AsyncResult == null)
447 p_AsyncResult = new MessageSessionAsyncResult(state, callback);
448 else
449 p_AsyncResult.Reset(state, callback);
450 p_DataTranseDirection = Network.Transe.DataTranseDirection.ReceivingData;
451 p_IsAsyncTranse = true;
452 p_TransingCallback = tccbk;
453 p_TranseHeader.TranseFlags = headerflag;
454 p_WaitReceiveMessage = false;
455 }
456
457 internal void ChangeToRcvParamets()
458 {
459 CloseStream();
460 DeleteTempFile();
461 p_Cb = null;
462 p_BytesTransferred = 0;
463 p_DataTranseDirection = DataTranseDirection.ReceivingData;
464 p_IsAsyncTranse = true;
465 p_TranseError = null;
466 p_IsCancel = false;
467 p_HeaderTransedOver = false;
468 p_ConnectToEndPoint = null;
469 p_ConnectTranseInterfaceSetting = null;
470 p_Message = null;
471 p_TranseHeader.TranseSize = 0;
472 p_WaitReceiveMessage = false;
473 }
474
475 internal void ResetToConnectParamets(
476 IMessage sendmessage,
477 EndPoint ep,
478 ConnectCallback cb,
479 object facesetting,
480 object state,
481 OnTransingCallback tccbk)
482 {
483 p_TransingCallback = tccbk;
484 p_IsAsyncTranse = true;
485 p_ConnectToEndPoint = ep;
486 p_DataTranseDirection = Network.Transe.DataTranseDirection.Connecting;
487 p_ConnectTranseInterfaceSetting = facesetting;
488 p_Cb = cb;
489 p_Message = sendmessage;
490 if (p_AsyncResult == null)
491 p_AsyncResult = new MessageSessionAsyncResult(state, null);
492 else
493 p_AsyncResult.Reset(state, null);
494 }
495
496 private ConnectCallback p_Cb;
497 }
498
499 internal class MessageSessionAsyncResult : IAsyncResult,IDisposable
500 {
501
502 internal MessageSessionAsyncResult(object state,AsyncCallback callback)
503 {
504 p_AsyncState = state;
505 p_CompletedSynchronously = false;
506 p_IsCompleted = false;
507 p_Callback = callback;
508 p_AsyncWaitHandle = null;
509 g_WaitLock = new object();
510 }
511
512 private object p_AsyncState;
513
514 private bool p_CompletedSynchronously;
515
516 private bool p_IsCompleted;
517
518 private AsyncCallback p_Callback;
519
520 private ManualResetEvent p_AsyncWaitHandle;
521
522 private object g_WaitLock;
523
524 #region IAsyncResult 成員
525
526 public object AsyncState
527 {
528 get { return p_AsyncState; }
529 }
530
531 public WaitHandle AsyncWaitHandle
532 {
533 get
534 {
535 lock (g_WaitLock)
536 {
537 if (p_AsyncWaitHandle == null)
538 p_AsyncWaitHandle = new ManualResetEvent(false);
539 return p_AsyncWaitHandle;
540 }
541 }
542 }
543
544 public bool CompletedSynchronously
545 {
546 get { return p_CompletedSynchronously; }
547 }
548
549 public bool IsCompleted
550 {
551 get { return p_IsCompleted; }
552 }
553
554 #endregion
555
556 internal bool SetHandle()
557 {
558 p_IsCompleted = true;
559 bool set = false;
560 lock (g_WaitLock)
561 {
562 if (p_AsyncWaitHandle != null)
563 {
564 p_AsyncWaitHandle.Set();
565 set = true;
566 }
567 }
568 if (!set)
569 {
570 if (p_Callback != null)
571 p_Callback(this);
572 }
573 return set;
574 }
575
576 #region IDisposable 成員
577
578 public void Dispose()
579 {
580 lock (g_WaitLock)
581 {
582 if (p_AsyncWaitHandle != null)
583 {
584 try
585 {
586 p_AsyncWaitHandle.Close();
587 }
588 catch { }
589 try
590 {
591 p_AsyncWaitHandle.Dispose();
592 }
593 catch { }
594 p_AsyncWaitHandle = null;
595 }
596 }
597 }
598
599 #endregion
600
601 private IMessage p_Response;
602
603 internal IMessage Response
604 {
605 get { return p_Response; }
606 set { p_Response = value; }
607 }
608
609 internal void ResetToNull()
610 {
611 Dispose();
612 p_AsyncState = null;
613 p_CompletedSynchronously = false;
614 p_IsCompleted = false;
615 p_Callback = null;
616 p_Response = null;
617 p_Error = null;
618 p_ConnecteFace = null;
619 p_Session = null;
620 }
621
622 internal void Reset(object state, AsyncCallback callback)
623 {
624 p_AsyncState = state;
625 p_Callback = callback;
626 p_IsCompleted = false;
627 }
628
629 private Exception p_Error;
630
631 internal Exception Error
632 {
633 get { return p_Error; }
634 set { p_Error = value; }
635 }
636
637 private ITranseInterface p_ConnecteFace;
638
639 internal ITranseInterface ConnectFace
640 {
641 get { return p_ConnecteFace; }
642 set { p_ConnecteFace = value; }
643 }
644
645 private IMessageSession p_Session;
646
647 internal IMessageSession Session
648 {
649 get { return p_Session; }
650 set { p_Session = value; }
651 }
652 }
653 }

1 public enum SR_StreamTypeEnum
2 {
3 /// <summary>
4 /// 自動選擇
5 /// </summary>
6 Auto,
7 /// <summary>
8 /// 位數組流
9 /// </summary>
10 Bytes,
11 /// <summary>
12 /// 文件流
13 /// </summary>
14 Files
15 }
16
17 internal delegate void ConnectCallback(MessageTranseParamets par);
BeginSendMessage方法:它和BeginTranseMessage方法一樣,只不過對waitrcv傳進False,也就是說該方法不等響應一旦發送完成就調用回調,而BeginTranseMessage方法要等待響應接收完成后再調用回調.
BeginReceiveMessage方法:它將參數ITranseParamets設為接收狀態后就開始等待接收數據,接收完成后就調用回調.
由於存在BeginSendMessage和BeginReceiveMessage方法,使用方可以進行N次發送和接收,這都是根據具體應用而定的,所以提供了Close和WaitClose方法由使用方負責在適當的時機關閉信道.
下面是IMessage接口定義,先貼出來:

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace YZKStdLibrary.Message
7 {
8 /// <summary>
9 /// 消息接口
10 /// </summary>
11 public interface IMessage
12 {
13 /// <summary>
14 /// 在服務進程中的消息唯一ID
15 /// </summary>
16 long MessageID { get; }
17 /// <summary>
18 /// 獲取登錄憑證,該憑證為經過服務端驗證的唯一標識
19 /// </summary>
20 string LoginedAuthentication { get; }
21 /// <summary>
22 /// 獲取調用成員名稱或Guid
23 /// </summary>
24 string InvokeMemberGuid { get; }
25 /// <summary>
26 /// 獲取處理該消息的服務類標識,使用該標識確定是哪個服務類處理該消息
27 /// </summary>
28 string ServiceGuid { get; }
29 /// <summary>
30 /// 獲取處理該消息的程序集
31 /// </summary>
32 string AssemblyGuid { get; }
33 /// <summary>
34 /// 消息參數數組
35 /// </summary>
36 object[] Paramets { get; }
37 }
38 }
OK,這一章就先到這了.