中文字幕人妻中文_99精品欧美一区二区三区综合在线_精品久久久久一区二区_色月丁香_免费福利在线视频_欧美大片免费观看网址_国产伦精品一区二区三区在线播放_污污污污污污www网站免费_久久月本道色综合久久_色69激情爱久久_尹人香蕉久久99天天拍_国产美女www_亚洲国产精品无码7777一线_五月婷婷六月激情_看免费一级片_精品久久久久久成人av_在线色亚洲_女人另类性混交zo_国产精品青青在线观看爽香蕉_人人澡人人添人人爽一区二区

主頁 > 知識庫 > Microsoft .Net Remoting系列教程之三:Remoting事件處理全接觸

Microsoft .Net Remoting系列教程之三:Remoting事件處理全接觸

熱門標簽:蘇州如何辦理400電話 西寧呼叫中心外呼系統線路商 臨沂智能電話機器人加盟 400電話辦理怎么樣 外呼電話機器人成本 聯通官網400電話辦理 百應電話機器人外呼系統 地圖標注軟件免費下載 網絡電話外呼系統上海

  前言:在Remoting中處理事件其實并不復雜,但其中有些技巧需要你去挖掘出來。正是這些技巧,仿佛森嚴的壁壘,讓許多人望而生畏,或者是不知所謂,最后放棄了事件在Remoting的使用。關于這個主題,在網上也有很多討論,相關的技術文章也不少,遺憾的是,很多文章概述的都不太全面。我在研究Remoting的時候,也對事件處理發生了興趣。經過參考相關的書籍、文檔,并經過反復的試驗,深信自己能夠把這個問題闡述清楚了。

  本文對于Remoting和事件的基礎知識不再介紹,有興趣的可以看我的系列文章,或查閱相關的技術文檔。

本文示例代碼下載:

Remoting事件(客戶端發傳真)

Remoting事件(服務端廣播)

Remoting事件(服務端廣播改進)

  應用Remoting技術的分布式處理程序,通常包括三部分:遠程對象、服務端、客戶端。因此從事件的方向上看,就應該有三種形式:

1、服務端訂閱客戶端事件
2、客戶端訂閱服務端事件
3、客戶端訂閱客戶端事件

  服務端訂閱客戶端事件,即由客戶端發送消息,服務端捕捉該消息,然后響應該事件,相當于下級向上級發傳真。反過來,客戶端訂閱服務端事件,則是由服務端發送消息,此時,所有客戶端均捕獲該消息,激發事件,相當于是一個系統廣播。而客戶端訂閱客戶端事件呢?就類似于聊天了。由某個客戶端發出消息,其他客戶端捕獲該消息,激發事件。可惜的是,我并沒有找到私聊的解決辦法。當客戶端發出消息后,只要訂閱了該事件的,都會獲得該信息。

  然而不管是哪一種方式,究其實質,真正包含事件的還是遠程對象。原理很簡單,我們想一想,在Remoting中,客戶端和服務端傳遞的內容是什么呢?毋庸置疑,是遠程對象。因此,我們傳遞的事件消息,自然是被遠程對象所包裹。這就像EMS快遞,遠程對象是運送信件的汽車,而事件消息就是汽車所裝載的信件。至于事件傳遞的方向,只是發送者和訂閱者的角色發生了改變而已。

一、 服務端訂閱客戶端事件

  服務端訂閱客戶端事件,相對比較簡單。我們就以發傳真為例。首先,我們必須具備傳真機和要傳真的文件,這就好比我們的遠程對象。而且這個傳真機上必須具備“發送”的操作按鈕。這就好比是遠程對象中的一個委托。當客戶發送傳真時,就需要在客戶端上激活一個發送消息的方法,這就好比我們按了“發送”按鈕。消息發送到服務端后,觸發事件,這個事件正是服務端訂閱的。服務端獲得該事件消息后,再處理相關業務。這就好比接收傳真的人員,當傳真收到后,會聽到接通的聲音,此時選擇“接收”后,該消息就被捕獲了。

現在,我們就來模擬這個流程。首先定義遠程對象,這個對象處理的應該是一個發送傳真的業務:
首先是遠程對象的公共接口(Common.dll):

public delegate void FaxEventHandler(string fax);
public interface IFaxBusiness
{
 void SendFax(string fax);
}

注意,在公共接口程序集中,定義了一個公共委托。

然后我們定義具體處理傳真業務的遠程對象類(FaxBusiness.dll),在這個類中,先要添加對公共接口程序集的引用:

public class FaxBusiness:MarshalByRefObject,IFaxBusiness
{ 
 public static event FaxEventHandler FaxSendedEvent;

 #region

 public void SendFax(string fax)
 {
 if (FaxSendedEvent != null)
 {
 FaxSendedEvent(fax);
 }
 }

 #endregion

 public override object InitializeLifetimeService()
 {
 return null;
 }
}

  這個遠程對象中,事件的類型就是我們在公共程序集Common.dll中定義的委托類型。SendFax實現了接口IFaxBusiness中的方法。這個方法的簽名和定義的委托一致,它調用了事件FaxSendedEvent。
特殊的地方是我們定義的遠程對象最好是重寫MarshalByRefObject類的InitializeLifetimeService()方法。返回null值表明這個遠程對象的生命周期為無限大。為什么要重寫該方法呢?道理不言自明,如果生命周期不進行限制的話,一旦遠程對象的生命周期結束,事件就無法激活了。
接下來就是分別實現客戶端和服務端了。服務端是一個Windows應用程序,界面如下:

我們在加載窗體的時候,注冊通道和遠程對象:

private void ServerForm_Load(object sender, System.EventArgs e)
{
 HttpChannel channel = new HttpChannel(8080);
 ChannelServices.RegisterChannel(channel);

 RemotingConfiguration.RegisterWellKnownServiceType(
 typeof(FaxBusiness),"FaxBusiness.soap",WellKnownObjectMode.Singleton);
 FaxBusiness.FaxSendedEvent += new FaxEventHandler(OnFaxSended);
}

  我們采用的是SingleTon模式,注冊了一個遠程對象。注意看,這段代碼和一般的Remoting服務端有什么區別?對了,它多了一行注冊事件的代碼:

FaxBusiness.FaxSendedEvent += new FaxEventHandler(OnFaxSended);

這行代碼,就好比我們服務端的傳真機,一直切換為“自動”模式。它會一直監聽著來自客戶端的傳真信息,一旦傳真信息從客戶端發過來了,則響應事件方法,即OnFaxSended方法:

public void OnFaxSended(string fax)
{
 txtFax.Text += fax;
 txtFax.Text += System.Environment.NewLine;
}

這個方法很簡單,就是把客戶端發過來的Fax顯示到txtFax文本框控件上。

而客戶端呢?仍然是一個Windows應用程序。代碼非常簡單,首先為了簡便其見,我們仍然讓它在裝載窗體的時候,激活遠程對象:

private void ClientForm_Load(object sender, System.EventArgs e)
{
 HttpChannel channel = new HttpChannel(0);
 ChannelServices.RegisterChannel(channel);

 faxBus = (IFaxBusiness)Activator.GetObject(typeof(IFaxBusiness),
 "http://localhost:8080/FaxBusiness.soap");
}

呵呵,可以說客戶端激活對象的方法和普通的Remoting客戶端應用程序沒有什么不同。該寫傳真了!我們在窗體上放一個文本框對象,改其Multiline屬性為true。再放一個按鈕,負責發送傳真:

private void btnSend_Click(object sender, System.EventArgs e)
{
 if (txtFax.Text != String.Empty)
 {
 string fax = "來自" + GetIpAddress() + "客戶端的傳真:"
 + System.Environment.NewLine;
 fax += txtFax.Text;
 faxBus.SendFax(fax);
 }
 else
 {
 MessageBox.Show("請輸入傳真內容!");
 }
}

private string GetIpAddress()
{ 
 IPHostEntry ipHE = Dns.GetHostByName(Dns.GetHostName());
 return ipHE.AddressList[0].ToString(); 
}

  在這個按鈕單擊事件中,只需要調用遠程對象faxBus的SendFax()方法就OK了,非常簡單。可是慢著,為什么你的代碼有這么多行啊?其實,沒有什么奇怪的,我只是想到發傳真的客戶可能會很多。為了避免服務端人員犯糊涂,搞不清楚是誰發的,所以要求在傳真上加上各自的簽名,也就是客戶端的IP地址了。既然要獲得計算機的IP地址,請一定要記得加上對DNS的命名空間引用:
using System.Net;

  因為我們嚴格按照分布式處理程序的部署方式,所以在客戶端只需要添加公共程序集(Common.dll)的引用就可以了。而在服務端呢,則必須添加公共程序集和遠程對象程序集兩者的引用。

OK,程序完成,我們來看看這個簡陋的傳真機:
客戶端:

嘿嘿,做夢都想放假啊。好的,傳真寫好了,發送吧!再看看服務端,great,老板已經收到我的請假條傳真了!

二、 客戶端訂閱服務端事件

  嘿嘿,吃甘蔗要先吃甜的一段,做事情我也喜歡先做容易的。現在,好日子過去了,該吃點苦頭了。我們先回憶一下剛才的實現方法,再來思考怎么實現客戶端訂閱服務端事件?

  在前一節,事件被放到遠程對象中,客戶端激活對象后,就可以發送消息了。而在服務端,只需要訂閱該事件就可以。現在思路應該反過來,由客戶端訂閱事件,服務端發送消息。就這么簡單嗎?先不要高興得太早。我們想一想,發送消息的任務是誰來完成的?是遠程對象。而遠程對象是什么時候創建的呢?我們仔細思考Remoting的幾種激活方式,不管是服務端激活,還是客戶端激活,他們的工作原理都是:客戶端決定了服務器創建遠程對象實例的時機,例如調用了遠程對象的方法。而服務端所作的工作則是注冊該遠程對象。

回憶這三種激活方式在服務端的代碼:

SingleCall激活方式:

RemotingConfiguration.RegisterWellKnownServiceType(
 typeof(BroadCastObj),"BroadCastMessage.soap",
 WellKnownObjectMode.Singlecall);

SingleTon激活方式:

RemotingConfiguration.RegisterWellKnownServiceType(
 typeof(BroadCastObj),"BroadCastMessage.soap",
 WellKnownObjectMode.Singleton);

客戶端激活方式:

RemotingConfiguration.ApplicationName = “BroadCastMessage.soap”
RemotingConfiguration.RegisterActivatedServiceType(typeof(BroadCastObj));

請注意Register這個詞語,它表達的含義就是注冊。也就是說,在服務端并沒有顯示的創建遠程對象實例。沒有該實例,又如何廣播消息呢?

或許有人會想,在注冊遠程對象之后,顯式實例該對象不就可以了嗎?也就是說,在注冊后加上這一段代碼:

BroadCastObj obj = new BroadCastObj();

  然而,我們要明白一個事實:就是服務端和客戶端是處于兩個不同的應用程序域中。因此在Remoting中,客戶端獲得的遠程對象實際是服務端注冊對象的代理。如果我們在注冊后,人工去創建一個實例,而非Remoting在激活后自動創建的對象,那么客戶端獲得的對象與服務端人工創建的實例是兩個迥然不同的對象。客戶端獲得的代理對象并沒有指向你剛才創建的obj實例。所以obj發送的消息,客戶端根本無法捕捉。

  那么,我們只有望洋興嘆,束手無策了嗎?別著急,別忘了在服務器注冊對象方法中,還有一種方法,即Marshal方法啊。還記得Marshal的實現方式嗎?

BroadCastObj Obj = new BroadCastObj();
ObjRef objRef = RemotingServices.Marshal(Obj,"BroadCastMessage.soap");

  這個方法與前不一樣。前面的三種方式,遠程對象是根據客戶端調用的方式,來自動創建的。而Marshal方法呢?則顯式地創建了遠程對象實例,然后將其Marshal到通道中,形成ObjRef指向對象的代理。只要生命周期沒有結束,這個對象就一直存在。而此時客戶端獲得的對象,正是創建的Obj實例的代理。

OK,這個問題解決了,我們來看看具體實現。
公共程序集和遠程對象與前相似,就不再贅述,只附上代碼:
公共程序集:

public delegate void BroadCastEventHandler(string info);

public interface IBroadCast
{
 event BroadCastEventHandler BroadCastEvent;
 void BroadCastingInfo(string info);
}

遠程對象類:

public event BroadCastEventHandler BroadCastEvent;

#region IBroadCast 成員

//[OneWay]
public void BroadCastingInfo(string info)
{
 if (BroadCastEvent != null)
 {
 BroadCastEvent(info);
 }
}

#endregion

public override object InitializeLifetimeService()
{
 return null;
}

  下面,該實現服務端了。在實現之前,我還想羅嗦幾句。在第一節中,我們實現了服務端訂閱客戶端事件。由于訂閱事件是在服務端發生的,因此事件本身并未被傳送。被序列化的僅僅是傳遞的消息,即Fax而已。現在,方向發生了改變,傳送消息的是服務端,客戶端訂閱了事件。但這個事件是放在遠程對象中的,因此事件必須被序列化。而在.Net Framework1.1中,微軟對序列化的安全級別進行了限制。有關委托和事件的序列化、反序列化默認是禁止的,所以我們應該將TypeFilterLevel的屬性值設置為Full枚舉值。因此在服務端注冊通道的方式就發生了改變:

private void StartServer()
{
 BinaryServerFormatterSinkProvider serverProvider = new
 BinaryServerFormatterSinkProvider();
 BinaryClientFormatterSinkProvider clientProvider = new
 BinaryClientFormatterSinkProvider();
 serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

 IDictionary props = new Hashtable();
 props["port"] = 8080;
 HttpChannel channel = new HttpChannel(props,clientProvider,serverProvider);
 ChannelServices.RegisterChannel(channel);

 Obj = new BroadCastObj();
 ObjRef objRef = RemotingServices.Marshal(Obj,"BroadCastMessage.soap"); 
}

注意語句serverProvider.TypeFilterLevel = TypeFilterLevel.Full;此語句即設置序列化安全級別的。要使用TypeFilterLevel屬性,必須申明命名空間:
using System.Runtime.Serialization.Formatters;

而后面兩條語句就是注冊遠程對象。由于在我的廣播程序中,發送廣播消息是放在另一個窗口中,因此我將該遠程對象聲明為公共靜態對象:

public static BroadCastObj Obj = null;

然后在調用窗口事件中加入:

private void ServerForm_Load(object sender, System.EventArgs e)
{
 StartServer();
 lbMonitor.Items.Add("Server started!");
}

來看看界面,首先啟動服務端主窗口:

我放了一個ListBox控件來顯示一些信息,例如顯示服務器啟動了。而BroadCast按鈕就是廣播消息的,單擊該按鈕,會彈出一個對話框:

BraodCast按鈕的代碼:

private void btnBC_Click(object sender, System.EventArgs e)
{ 
 BroadCastForm bcForm = new BroadCastForm();
 bcForm.StartPosition = FormStartPosition.CenterParent;
 bcForm.ShowDialog();
}

在對話框中,最主要的就是Send按鈕:

if (txtInfo.Text != string.Empty)
{ 
 ServerForm.Obj.BroadCastingInfo(txtInfo.Text);
}
else
{
 MessageBox.Show("請輸入信息!");
}


但是很簡單,就是調用遠程對象的發送消息方法而已。

現在該實現客戶端了。我們可以參照前面的例子,只是把服務端改為客戶端而已。另外考慮到序列化安全級別的問題,所以代碼會是這樣:

private void ClientForm_Load(object sender, System.EventArgs e)
{
 BinaryServerFormatterSinkProvider serverProvider = new
 BinaryServerFormatterSinkProvider();
 BinaryClientFormatterSinkProvider clientProvider = new
 BinaryClientFormatterSinkProvider();
 serverProvider.TypeFilterLevel = TypeFilterLevel.Full;

 IDictionary props = new Hashtable();
 props["port"] = 0;
 HttpChannel channel = new HttpChannel(props,clientProvider,serverProvider);
 ChannelServices.RegisterChannel(channel);

 watch = (IBroadCast)Activator.GetObject(
 typeof(IBroadCast),"http://localhost:8080/BroadCastMessage.soap"); 
 watch.BroadCastEvent += new BroadCastEventHandler(BroadCastingMessage);
}

注意客戶端通道的端口號應設置為0,這表示客戶端自動選擇可用的端口號。如果要設置為指定的端口號,則必須保證與服務端通道的端口號不相同。
然后是,BroadCastEventHandler委托的方法:

public void BroadCastingMessage(string message)
{
 txtMessage.Text += "I got it:" + message; 
 txtMessage.Text += System.Environment.NewLine; 
}

客戶端界面如圖:

好,下面讓我們滿懷期盼,來運行這段程序。首先啟動服務端應用程序,然后啟動客戶端。哎呀,糟糕,居然出現了錯誤信息!

  “人之不如意事,十常居八九。”不用沮喪,讓我們分析原因。首先看看錯誤信息,它報告我們沒有找到Client程序集。然而事實上,Client程序集當然是有的。那么再來調試一下,是哪一步出現的問題呢?設置好斷點,進行逐語句跟蹤。前面注冊通道一切正常,當運行到watch.BroadCastEvent += new BroadCastEventHandler(BroadCastingMessage)語句時,錯誤出現了!

  也就是說,遠程對象的創建是成功的,但在訂閱事件的時候失敗了。原因是什么呢?原來,客戶端的委托是通過序列化后獲得的,在訂閱事件的時候,委托試圖裝載包含與簽名相同的方法的程序集,也就是BroadCastingMessage方法所在的程序集Client。然而這個裝載的過程發生在服務端,而在服務端,并沒有Client程序集存在,自然就發生了上面的異常。

  原因清楚了,怎么解決?首先BroadCastingMessage方法肯定是在客戶端中,所以不可避免,委托裝載Client程序集的過程也必須在客戶端完成。而服務端事件又是由遠程對象來捕獲的,因此,在客戶端注冊的也就必須是遠程對象事件了。一個要求必須在客戶端,一個又要求必須在服務端,事情出現了自相矛盾的地方。

那么,讓我們先想想這樣一個例子。假設我們要交換x和y的值,該這樣完成?很簡單,引入一個中間變量就可以了。

int x=1,y=2,z;
z = x;
x = y;
y = z;

這個游戲相信大家都會玩吧,那么好的,我們也需要引入這樣一個“中間”對象。這個中間對象和原來的遠程對象在事件處理方面,代碼完全一致:

public class EventWrapper:MarshalByRefObject
{
 public event BroadCastEventHandler LocalBroadCastEvent;

 //[OneWay]
 public void BroadCasting(string message)
 {
 LocalBroadCastEvent(message);
 }

 public override object InitializeLifetimeService()
 {
 return null;
 }
}

不過不同之處在于:這個Wrapper類必須在客戶端和服務端上都要部署,所以,這個類應該放在公共程序集Common.dll中。

現在再來修改原來的客戶端代碼:

watch = (IBroadCast)Activator.GetObject(
 typeof(IBroadCast),"http://localhost:8080/BroadCastMessage.soap"); 
watch.BroadCastEvent += new BroadCastEventHandler(BroadCastingMessage);

修改為:

watch = (IBroadCast)Activator.GetObject(
 typeof(IBroadCast),"http://localhost:8080/BroadCastMessage.soap");
EventWrapper wrapper = new EventWrapper(); 
wrapper.LocalBroadCastEvent += new BroadCastEventHandler(BroadCastingMessage);
watch.BroadCastEvent += new BroadCastEventHandler(wrapper.BroadCasting);

為什么這樣做就可以了呢?也許畫一幅圖就很容易說明,可惜我的藝術天分實在很糟糕,我希望以后可以改進這一點。還是用文字來說明吧。

前面說,委托要裝載client程序集。現在我們把遠程對象委托裝載的權利移交給EventWrapper。因為這個類對象是放在客戶端的,所以它要裝載client程序集絲毫沒有問題。語句:

EventWrapper wrapper = new EventWrapper(); 
wrapper.LocalBroadCastEvent += new BroadCastEventHandler(BroadCastingMessage);

實現了這個功能。

  不過此時雖然訂閱了事件,但事件還是客戶端的,沒有與服務端聯系起來。而服務端的事件是放到遠程對象中的,所以,還要訂閱事件,這個任務由遠程對象watch來完成。但此時它訂閱的不再是BroadCastingMessage了,而是EventWrapper的觸發事件方法BroadCasting。那么此時委托同樣要裝載程序集,但此時裝載的就是BroadCasting所在的程序集了。由于裝載發生的地點是在服務端。呵呵,高興的是,BroadCasting所在的程序集正是公共程序集(前面已說過,EventWrapper應放到公共程序集Common.dll中),而公共程序集在服務端和客戶端都已經部署了。自然就不會出現找不到程序集的問題了。

注意:EventWrapper因為要重寫InitializeLifetimeService()方法,所以仍然要繼承MarshalByRefObject類。

現在再來運行程序。首先運行服務端;然后運行客戶端,OK,客戶端窗體出現了:

然后我們在服務端單擊“BroadCast”按鈕,發送廣播消息:

單擊“Send”發送,再來看看客戶端,會是怎樣?Fine,I got it!

怎么樣,很酷吧!你也可以同時打開多個客戶端,它們都將收到這個廣播信息。如果你覺得這個廣播聲音太吵,那就請你在客戶端取消廣播吧。在Cancle按鈕中:

private void btnCancle_Click(object sender, System.EventArgs e)
{
 watch.BroadCastEvent -= new BroadCastEventHandler(wrapper.BroadCasting);
 MessageBox.Show("取消訂閱廣播成功!");
}

當然這個時候wrapper對象應該被申明為private對象了:
private EventWrapper wrapper = null;

取消后,你試著再廣播一下,恭喜你,你不會聽到噪音了!

三、 客戶端訂閱客戶端事件

  有了前面的基礎,再來看客戶端訂閱客戶端事件,就簡單多了。而本文寫到這里,我也很累了,你也被我啰嗦得不耐煩了。你心里在喊,“饒了我吧!”其實,我又何嘗不是如此。所以我只提供一個思路,有興趣的朋友,可以自己寫一個程序。

  其實方法很簡單,和第二種情況類似。發送信息的客戶端,只需要獲得遠程對象后,發送消息就可以了。而接收信息的客戶端,負責訂閱該事件。由于事件都是放到遠程對象中,因此訂閱的方法和第二種情況沒有什么區別!

  特殊的情況是,我們可以用第三種情況來代替第二種。只要你把發送信息的客戶端放到服務端就可以了。當然需要做一些額外的工作,有興趣的朋友可以去實現一下。在我的示例程序中,已經用這種方法模擬實現了服務端的廣播,大家可以去看看。

四、 一點補充

我在前面的事件處理中,使用的都是默認的EventArgs。如果要定義自己的EventArgs,就不相同了。因為該信息是傳值序列化,因此必須加上[Serializable],且必須放到公共程序集中,部署到服務端和客戶端。例如:

[Serializable]
public class BroadcastEventArgs:EventArgs
{
 private string msg = null;
 public BroadcastEventArgs(string message)
 {
 msg = message;
 }

 public string Message
 {
 get {return msg;}
 }
}

五、持續改進(經Beta的提醒,我改進了我的程序,并對文章進行了修改 2004年12月13日)

  也許,細心的讀者注意到了,在我的遠程對象類和EventWrapper類中,觸發事件方法的Attribute[OneWay]被我注釋掉了。我看到很多資料上寫到,在Remoting中處理事件,觸發事件的方法必須具有這個Attribute。這個attribute究竟有什么用?

  在發送事件消息的時候,事件的訂閱者會觸發事件,然后響應該事件。然而當事件的訂閱者發生錯誤的時候呢?例如,發送事件消息的時候,才發現根本沒有事件訂閱者;或者事件的訂閱者出現故障,如斷電、或異常關機。此時,發送事件一方會因為找不到正確的事件訂閱者,而發生異常。以我的程序為例。當我們分別打開服務端和客戶端程序的時候,此時廣播信息正常。然而,當我們關閉客戶端后,由于該客戶端沒有取消訂閱,此時異常發生,提示信息如圖:

  (不知道為什么,這個異常與客戶端連接服務端出現的異常一樣。這個異常容易讓人產生誤會。)

  如果這個時候我們同時打開了多個客戶端,那么其他客戶端就會因為這一個客戶端關閉造成的錯誤,而無法收到廣播信息。那么讓我們先做第一步改進:

1、先考慮正常情況。在我的客戶端,雖然提供了取消訂閱的操作,但并沒有考慮用戶關閉客戶端的情況。即,關閉客戶端時,并未取消事件的訂閱,所以我們應該在關閉客戶端窗體中寫入:

private void ClientForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
 watch.BroadCastEvent -= new BroadCastEventHandler(wrapper.BroadCasting);
}

2、僅僅是這樣還不夠。如果客戶端并沒有正常關閉,而是因為突然斷電而導致客戶端關閉呢?此時,客戶端還沒有來得及取消事件訂閱呢。在這種情況下,我們需要用到OneWayAttribute。

前面說到,發送事件一方如果找不到正確的事件訂閱者,會發生異常。也就是說,這個事件是unreachable的。幸運的是,OneWayAttribute恰好解決了這個問題。其實從該特性的命名OneWay,大約也能猜到其中的含義。當事件不可到達,無法發送時,正常情況下,會返回一個異常信息。如果加上OneWayAttribute,這個事件的發送就變成單向的了。假如此時發生異常,那么系統會自動拋掉該異常信息。由于沒有異常信息的返回,發送信息方會認為發送信息成功了。程序會正常運行,錯誤的客戶端被忽略,而正確的客戶端仍然能夠收到廣播信息。

因此,遠程對象的代碼就應該是這樣:

public event BroadCastEventHandler BroadCastEvent;

IBroadCast 成員

public override object InitializeLifetimeService()
{
 return null;
}

3、最后的改進

  使用OneWay固然可以解決上述的問題,但不夠友好。因為對于廣播消息的一方來說,象被蒙上了眼睛一樣,對于客戶端發生的事情懵然不知。這并不是一個好的idea。在Ingo Rammer的Advanced .NET Remoting一書中,Ingo Rammer先生提出了一個更好的辦法,就是在發送信息一方時,檢查了委托鏈。并在委托鏈的遍歷中來捕獲異常。當其中一個委托發生異常時,顯示提示信息。然后繼續遍歷后面的委托,這樣既保證了異常信息的提示,又保證了其他訂閱者正常接收消息。因此,我對本例的遠程對象進行了修改,注釋掉[OneWay],修改了BroadCastInfo()方法:

//[OneWay]
public void BroadCastingInfo(string info)
{
 if (BroadCastEvent != null)
 {
 BroadCastEventHandler tempEvent = null;

 int index = 1; //記錄事件訂閱者委托的索引,為方便標識,從1開始。
 foreach (Delegate del in BroadCastEvent.GetInvocationList())
 {
 try
 {
 tempEvent = (BroadCastEventHandler)del;
 tempEvent(info);
 }
 catch
 { 
 MessageBox.Show("事件訂閱者" + index.ToString() + "發生錯誤,系統將取消事件訂閱!");
 BroadCastEvent -= tempEvent;
 }
 index++;
 } 
 }
 else
 {
 MessageBox.Show("事件未被訂閱或訂閱發生錯誤!");
 }
}

我們來試驗一下。首先打開服務端,然后同時打開三個客戶端。廣播消息:

消息發送正常。

接著關閉其中一個客戶端窗口,再廣播消息(注意為模擬客戶端異常情況,應在ClientForm_Closing方法中把第一步改進的取消訂閱代碼注釋。否則不會發生異常。難道你真的愿意用斷電來導致異常發生嗎^_^),結果如圖:

此時服務端報告了“事件訂閱者1發生錯誤,系統將取消事件訂閱”。注意此時另外兩個客戶端,還是和前面一樣,只有兩條廣播信息。

當我們點擊提示框的“確定”按鈕后,廣播仍然發送:

通過這樣的改進后,程序更加的完善,也更加的健壯和友好!

附:
示例代碼說明:
1、Remoting事件(客戶端發傳真)壓縮包:為第一節內容;
2、Remoting事件(服務端廣播)壓縮包:為第二節、第三節內容,其中:
第二節代碼包含于:
#region 客戶端訂閱服務端事件
#endregion
第三節代碼包含于:
#region 客戶端訂閱客戶端事件
#endregion
如果要實現第二節的程序,請注釋掉第三節代碼;反之亦然。示例程序默認為第二節程序。
3、運行示例程序時,請先運行服務端程序,然后運行客戶端程序。否則會拋出“基礎連接已關閉”的異常。
4、解決方案均放在Common(或ICommon)文件夾中。

5、改進后的代碼放到Remoting事件(服務端廣播改進)壓縮包中,大家可以比較一下改進后的程序有何不同!

以上就是.Net Remoting中Remoting事件處理的全部內容,希望能給大家一個參考,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • Microsoft .Net Remoting系列教程之二:Marshal、Disconnect與生命周期以及跟蹤服務
  • Microsoft .Net Remoting系列教程之一:.Net Remoting基礎篇
  • Flex 錯誤(mx.messaging.messages::RemotingMessage)分析
  • ASP.NET通過Remoting service上傳文件
  • java webservice上傳下載文件代碼分享
  • java通過客戶端訪問服務器webservice的方法
  • ASP.NET使用WebService實現天氣預報功能
  • jQuery調用Webservice傳遞json數組的方法
  • C# WebService發布以及IIS發布
  • Remoting和Webservice的詳細介紹及區別

標簽:慶陽 甘肅 海西 平涼 中衛 清遠 臨夏 聊城

巨人網絡通訊聲明:本文標題《Microsoft .Net Remoting系列教程之三:Remoting事件處理全接觸》,本文關鍵詞  Microsoft,.Net,Remoting,系列,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Microsoft .Net Remoting系列教程之三:Remoting事件處理全接觸》相關的同類信息!
  • 本頁收集關于Microsoft .Net Remoting系列教程之三:Remoting事件處理全接觸的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 江苏久盛机械设备有限公司| 佛山市宝索机械制造有限公司 | 张家港海狮洗涤机械有限公司 | 江门市机械有限公司| 芜湖灵芝机械有限公司| 东莞市数控机械有限公司| 宁波市鸿博机械制造有限公司 | 江苏联鑫钢铁有限公司| 东莞市凯奥机械有限公司| 南通昭和机械有限公司| 高峰机械工业有限公司| 石家庄米兹机械设备有限公司| 上海瑞派机械有限公司招聘| 佛山市永盛达机械有限公司| 重庆龙文机械设备有限公司 | 浙江西子重工机械有限公司| 上海依澳包装机械有限公司| 山东重机械有限公司| 常州市机械有限公司| 东莞市岛精机械有限公司| 台州宏汇机械有限公司| 上海熊猫机械有限公司| 山东问云机械有限公司| 常州龙鹏机械有限公司| 台州通宇变速机械有限公司| 浙江嘉元机械制造有限公司| 上海赛峰包装机械设备有限公司 | 成都经纬机械制造有限公司| 山东德丰重工有限公司| 常州倍安特动力机械有限公司| 山西 机械有限公司| 上海造纸机械有限公司| 上海七洋液压机械有限公司| 铁岭圣添机械有限公司| 泉州市劲力工程机械有限公司 | 济南精密机械有限公司| 西安北村精密机械有限公司| 佛山市机械设备有限公司| 亿佰通机械有限公司| 上海展仕机械设备有限公司| 宁波海伯精密机械制造有限公司 | 上海众德机械有限公司| 德龙钢铁有限公司地址| 苏州恒升机械有限公司| 东莞高恩机械有限公司| 天津亨旺机械有限公司| 成都富江机械制造有限公司| 烟台博迈机械有限公司| 上海爱德夏机械有限公司 | 输送机械制造有限公司| 郑州一帆机械设备有限公司| 浙江双联机械有限公司| 温岭市大众精密机械有限公司| 扬州鼎隆机械有限公司| 中船重工环境工程有限公司| 南京力霸起重设备机械有限公司 | 南京凯友橡塑机械有限公司| 东莞名震机械制造有限公司| 昆山乔地精密机械有限公司| 安庆佳乐机械有限公司| 河北强华水利机械有限公司| 济南欧亚德数控机械有限公司| 南京彩途机械设备有限公司| 石家庄博锐食品机械有限公司| 河南耿力支护机械设备有限公司 | 南通恒力重工机械有限公司| 东莞市亿德机械设备有限公司| 海的动力机械有限公司| 小森机械南通有限公司| 山东兖州煤矿机械有限公司| 襄阳博亚机械有限公司| 青岛海佳机械有限公司| 石家庄聚力特机械有限公司| 常州宏机械有限公司| 三一起重机械有限公司| 浙江新罗兰机械有限公司| 河北明芳钢铁有限公司| 张家港市贝尔机械有限公司| 东莞市天成机械有限公司| 山东鲁一机械有限公司| 南通密炼捏合机械有限公司| 上海天和制药机械有限公司| 上海 机械设备有限公司| 河南甲庚机械设备有限公司| 东莞市宝腾机械有限公司| 鑫成机械设备有限公司| 山东威曼机械有限公司| 山东和晟机械设备有限公司| 江苏沃得农业机械有限公司| 梧州沃华机械有限公司| 三星重工业宁波有限公司招聘| 青岛美克精密机械有限公司| 临沂金立机械有限公司| 江阴华西钢铁有限公司| 烟台 机械有限公司| 东莞市鸿企机械有限公司| 南通力福通起重机械有限公司 | 常州朝康机械有限公司| 张家港白熊科美机械有限公司| 河南龙昌机械有限公司| 苏州松博机械有限公司| 设备机械制造有限公司| 广州汉牛机械设备有限公司| 河南丰泉机械有限公司| 浙江上易机械有限公司| 上海造纸机械有限公司| 江苏昆仑钢铁有限公司| 福建泉工机械有限公司| 芜湖机械制造有限公司| 南通科诚橡塑机械有限公司 | 烟台浩阳机械有限公司| 江阴古川机械有限公司| 广州市磊蒙机械设备有限公司| 福建烟草机械有限公司| 郑州包装机械有限公司| 新乡市中天机械有限公司| 山东大汉建设机械有限公司| 盐城万富隆机械制造有限公司 | 东莞市业佳精密机械有限公司| 南昌全球机械有限公司| 山东闽源钢铁有限公司| 郑州谷丰机械设备有限公司| 上海凌鹰机械有限公司| 东莞正扬电子机械有限公司怎么样 | 黄石永辉机械有限公司| 沈阳鸿本机械有限公司| 东莞市源机械有限公司| 上海化工机械厂有限公司| 江苏百事德机械有限公司| 浙江华安机械有限公司| 成都兴业邦达重工机械有限公司| 西安 工程机械有限公司| 佛山市晶菱玻璃机械有限公司| 天津安东石油机械制造有限公司| 潍坊 机械 有限公司| 易百通机械有限公司| 江苏百德机械有限公司| 浙江制药机械有限公司| 江苏双箭输送机械有限公司| 宁波星箭航天机械有限公司| 台湾晁群机械有限公司| 山东翔工机械有限公司| 浙江远信印染机械有限公司| 无锡诺亚机械有限公司| 嘉兴市宏丰机械有限公司| 卓郎新疆智能机械有限公司| 绍兴 机械有限公司| 苏州神峰起重机械有限公司| 瑞达机械设备有限公司| 工程机械制造有限公司| 石家庄聚力特机械有限公司| 嘉兴精密机械有限公司| 潍坊永成机械有限公司| 沈阳 机械 有限公司| 青岛莱恩机械有限公司| 莱州 机械有限公司| 上海利昆机械有限公司| 沧州凯德机械有限公司| 和和机械(张家港)有限公司 | 山东岳工机械有限公司| 上海世达机械工具厂有限公司| 山东机械设备有限公司| 济南博威液压机械有限公司| 中核 天津 机械有限公司| 天津云飞机械有限公司| 太仓精密机械有限公司| 晋江力达机械有限公司| 湖北 机械 有限公司| 山东起重机有限公司| 长春 机械 有限公司| 瑞达机械设备有限公司| 大丰 机械有限公司| 建材机械制造有限公司| 哈尔滨机械设备有限公司| 鸿达机械设备有限公司| 江苏中科机械有限公司| 湖南运想重工有限公司| 盐山宏润重工有限公司| 天工机械制造有限公司| 襄阳博亚机械有限公司| 成都康博机械有限公司| 山西建龙钢铁有限公司| 中机建重工有限公司| 益丰泰机械有限公司| 江阴市科盛机械有限公司| 河南华北起重吊钩有限公司| 上海德耐尔压缩机械有限公司| 上海丁博重工机械有限公司| 杭州玻璃机械有限公司| 温州科迪机械有限公司| 柳州市宏华机械有限公司| 临沂园林机械有限公司| 上海起鑫贸易有限公司| 浙江晨雕机械有限公司| 山东正阳机械有限公司| 郑州明瑞机械设备有限公司| 沈阳沈飞航宇机械制造有限公司| 西安机械设备有限公司| 三明机械制造有限公司| 郑州鼎盛机械设备有限公司| 桐乡合德机械有限公司| 宁波住重机械有限公司| 一帆机械设备有限公司| 石家庄博锐食品机械有限公司 | 台湾晁群机械有限公司| 大连红日机械有限公司| 郑州同鼎机械设备有限公司| 辽宁天亿机械有限公司| 昆山锦沪机械有限公司| 玉环 机械有限公司| 成都 食品机械有限公司| 东方机械制造有限公司| 苏州擎邦机械有限公司| 无锡美高帝机械有限公司| 中核天津机械有限公司| 上海永德食品机械有限公司| 潍坊凯德塑料机械有限公司| 青岛美嘉隆包装机械有限公司| 常州科尧机械有限公司| 苏州诚亚机械有限公司| 浙江志高机械有限公司| 潍坊钰兴机械有限公司| 宁波达峰机械有限公司| 山东中探机械有限公司| 杭州速博雷尔传动机械有限公司| 东阳机械设备制造有限公司| 河南一重起重机有限公司| 浙江亿鹏机械有限公司| 新科起重机有限公司| 蚌埠柳工机械有限公司| 台州博州机械有限公司| 泉州巨能机械有限公司| 东莞市英豪机械有限公司| 武汉餐至饮机械设备有限公司| 长春协展机械工业有限公司| 嘉兴市机械有限公司| 杭州恒机械有限公司| 浙江省机械有限公司| 东莞伟机械有限公司| 安阳钢铁贸易有限公司| 泉州市机械有限公司| 连云港市机械有限公司| 食品包装机械有限公司| 安徽宏远机械制造有限公司| 东莞奥锐机械有限公司| 北京余特包装机械有限公司| 苏州恩贝德机械有限公司| 烟台绿林机械设备制造有限公司| 湖南汇一制药机械有限公司| 鹤壁市通用机械电气有限公司| 东莞市恒生机械制造有限公司| 江苏瀚皋机械有限公司| 东源精密机械有限公司| 宁波东泰机械有限公司| 上海嘉峥机械有限公司| 恒瑞机械制造有限公司| 辽阳喜旺机械制造有限公司| 青岛谊金华塑料机械有限公司 | 东莞市得士威机械工业有限公司| 南京彩途机械设备有限公司| 上海博储机械工业有限公司 | 世翔精密机械制造有限公司| 瑞安市天晟包装机械有限公司| 安丘瑞源机械制造有限公司| 山东云光钢铁有限公司| 杭州永创机械有限公司| 新疆昆玉钢铁有限公司| 青岛机械设备有限公司| 青岛德固特机械制造有限公司 | 浙江环兴机械有限公司| 南通图海机械有限公司| 苏州安特精密机械有限公司| 浙江康机械有限公司| 江阴华东机械有限公司| 安徽金锡机械有限公司| 湖南五丰机械有限公司| 上海工程机械厂有限公司| 锋机械设备有限公司| 上海华迪机械有限公司| 广州坚诺机械设备有限公司| 昆山贝奇精密机械有限公司| 合肥明泰机械施工有限公司| 湖南龙凤机械制造有限公司| 东莞通盛机械有限公司| 重工机械制造有限公司| 济南钢铁 有限公司| 漳州 机械有限公司| 汕头市包装机械有限公司| 上海浩勇精密机械有限公司| 康铖机械设备有限公司| 徐州液压机械制造有限公司| 唐山印刷机械有限公司| 上海烨昌食品机械有限公司| 河北钢铁矿业有限公司| 合肥福晟机械制造有限公司 | 重庆志成机械有限公司| 济南恒铭钢铁有限公司| 中铁重工有限公司武汉| 武汉环卫机械有限公司| 上海宏挺机械设备制造有限公司 | 上海卓越机械有限公司| 扬州扬宝机械有限公司| 自动化机械有限公司| 威斯特机械有限公司| 无锡印染机械有限公司| 广州晶冠机械有限公司| 兰州华诚石化机械制造有限公司| 长城机械制造有限公司| 江西机械制造有限公司| 常州市锦益机械有限公司| 注册机械设备有限公司有什么要求 | 河北迪森机械制造有限公司| 漳州 机械有限公司| 河南真牛起重机有限公司| 恒丰机械配件有限公司| 潍坊山水环保机械制造有限公司| 巩义市瑞赛克机械设备有限公司 | 唐山利丰机械有限公司| 上海朗惠包装机械有限公司| 珠海粤裕丰钢铁有限公司| 广州中益机械有限公司| 山东机械设备有限公司| 福建海源机械有限公司| 上海 包装机械有限公司| 协展机械工业有限公司| 衡阳运输机械有限公司| 山东泗水鑫峰面粉机械有限公司| 上海奕晟矿山机械有限公司| 浙江博创机械有限公司| 无锡锡昌机械有限公司| 东风悦达起亚汽车有限公司| 江苏宇达机械有限公司| 佛山市海之力机械有限公司| 登福机械(上海)有限公司| 昆山乙盛机械工业有限公司电话 | 三明 机械有限公司| 兰州机械设备有限公司| 广州伟乐机械设备有限公司| 威马农业机械有限公司| 天津 机械制造有限公司| 临沂金立机械有限公司| 上海嘉歆包装机械有限公司| 临沂盛德机械有限公司| 中阳钢铁有限公司电话| 广东巨风机械制造有限公司| 玉环万全机械有限公司| 佛山市 重工有限公司| 均强机械苏州有限公司| 富杰精密机械有限公司| 张家港市通惠化工机械有限公司| 上海玖钲机械设备有限公司 | 杭州大禹机械有限公司| 广西金达机械有限公司| 福州 机械制造有限公司| 浙江东雄重工有限公司| 武汉 机械制造有限公司| 江苏精明机械有限公司| 智能机械制造有限公司| 杭州天杨机械有限公司| 上海枫信传动机械有限公司| 保定华光机械有限公司| 起重设备(上海)有限公司| 浙江诚泰化工机械有限公司| 机械进出口有限公司招聘| 烟台安信精密机械有限公司| 上海昊农农业机械有限公司| 常林道依茨法尔机械有限公司 | 玉环方博机械有限公司| 立信染整机械深圳有限公司| 浙江机械设备有限公司| 宝鸡忠诚制药机械有限公司| 江苏舜天机械进出口有限公司| 肥城云宇机械有限公司| 包装机械设备有限公司| 昆山瑞钧机械设备有限公司| 大连军峰机械有限公司| 苏州威锐机械有限公司| 南京益腾机械制造有限公司| 华鑫机械制造有限公司| 济南恒迪机械有限公司| 湖南民和重工机械有限公司| 山东精诺机械有限公司| 山东山工机械有限公司| 北京大森包装机械有限公司| 郑州工程机械有限公司| 湖南一田农业机械有限公司| 郑州市建新机械制造有限公司| 云南机械制造有限公司| 青岛西城铸造机械有限公司| 肥城云宇机械有限公司| 上海科熙起重设备有限公司| 浙江流遍机械润滑有限公司 | 利星行机械有限公司| 新乡市西贝机械有限公司| 江阴市化工机械有限公司| 苏州恒升机械有限公司| 宁波华表机械制造有限公司| 上海 包装机械 有限公司| 莱州市龙骏化工机械有限公司| 上海乾承机械设备有限公司| 北京中车重工机械有限公司| 广州精密机械有限公司| 江阴市药化机械有限公司| 宁波华骏机械有限公司| 江苏洪流化工机械有限公司| 北京龙泰机械设备安装有限公司| 食品包装机械有限公司| 合肥起重机械有限公司| 安徽博行机械有限公司| 日照钢铁轧钢有限公司| 苏州典艺精密机械有限公司| 徐州智茸工程机械有限公司| 山东锦鹏机械有限公司| 扬州 机械 有限公司| 机械配件苏州有限公司| 广东巨风机械制造有限公司| 东莞迅得机械有限公司| 唐山宝泰钢铁有限公司| 天津华悦包装机械有限公司| 山东中悦钢铁有限公司| 镇江宏泰钢铁有限公司| 山东农业机械有限公司| 山东钢铁贸易有限公司| 力士德机械有限公司| 航星洗涤机械(泰州)有限公司 | 新昌华亿机械有限公司| 南通丰威机械有限公司| 洛阳奥图机械设备有限公司| 东营程祥机械有限公司| 深圳新添润彩印机械设备有限公司| 上海祝融起重机械有限公司 | 广东巨风机械制造有限公司| 杭州永创机械有限公司| 常州恒力机械有限公司| 大连万阳重工有限公司| 武汉联明机械有限公司| 重庆江增机械有限公司| 青岛晟森机械有限公司| 常州动力机械有限公司| 河北机械进出口有限公司| 山东峻峰起重机械有限公司| 东莞市台钢机械设备有限公司| 五矿钢铁天津有限公司| 杭州天恒机械有限公司| 宁波凯特机械有限公司| 山东隆盛钢铁有限公司| 浙江兴盛机械有限公司| 苏州英维特精密机械有限公司| 浙江双鸟机械有限公司| 青岛工程机械有限公司| 泉州机械制造有限公司| 常州市菲德机械部件有限公司| 武汉钢铁有限公司疫情| 东莞宏品智能机械有限公司| 河南佳德机械有限公司| 南阳市 机械有限公司| 浙江安驰机械有限公司| 东莞市雅康精密机械有限公司| 山东大华机械有限公司| 鑫港机械制造有限公司| 成都的起重有限公司| 三明 机械有限公司| 上海香宝机械设备有限公司| 杭州凯邦机械有限公司| 廊坊包装机械有限公司| 沈阳顺达重矿机械制造有限公司| 泉州群峰机械有限公司| 山东顺达机械有限公司| 吉林吉钢铁有限公司| 重庆江增船舶重工有限公司| 日照港达船舶重工有限公司| 威塑料机械有限公司| 中核天津机械有限公司| 机械化工工程有限公司| 常州华威起重工具有限公司| 青州三和机械有限公司| 芜湖汇丰机械工业有限公司 | 成都兴业邦达重工机械有限公司| 苏州 机械有限公司| 烟台市石油机械有限公司| 济宁经纬工程机械有限公司| 山东白龙机械有限公司| 海华机械制造有限公司| 广东正力精密机械有限公司 | 启英机械设备有限公司| 河南起重机器有限公司| 阳谷山立克工程机械有限公司| 苏州晋日五金机械有限公司| 济南迈动数控机械有限公司| 厦门厦工重工有限公司| 东莞自动化机械有限公司| 北京洛克机械有限公司| 海德机械设备有限公司| 广州起重机械有限公司| 青岛万邦包装机械有限公司| 河北中伟机械有限公司| 重庆宝汇跨搏机械制造有限公司| 曲阜兴运输送机械设备有限公司 | 上海曼亿包装机械有限公司| 旭恒精工机械制造有限公司| 村田机械上海有限公司| 上海上丰机械有限公司| 江苏东禾机械有限公司| 湛江恒润机械有限公司| 云南机械设备有限公司| 江阴伟江机械有限公司| 郑州中意矿山机械有限公司| 常州儒邦机械有限公司| 烟台建筑机械有限公司| 上海安展机械设备有限公司| 宁波康博机械有限公司| 广东盈钢机械有限公司| 无锡起重机械有限公司| 佛山市洛德机械设备有限公司| 江苏华夏重工有限公司| 矿山机械设备有限公司| 嘉兴 机械有限公司| 滦南华瑞钢铁有限公司| 天马电子机械有限公司| 宁波奥晟机械有限公司| 雅康精密机械有限公司| 安徽远鸿机械自动化有限公司| 业精机械制造有限公司| 金属制品有限公司起名| 中实洛阳重型机械有限公司实习报告| 山东精诺机械有限公司| 马鞍山钢铁有限公司| 郑州市长城重工机械有限公司| 成都鑫泽机械有限公司| 江阴长达钢铁有限公司| 无锡通用机械厂有限公司| 东莞宝科机械有限公司| 石油机械制造有限公司| 杭州通绿机械有限公司| 嘉宝精密机械有限公司| 温州市润新机械制造有限公司| 无锡东元精密机械有限公司| 旭恒精工机械制造有限公司| 江阴市机械有限公司| 杭州神钢建设机械有限公司| 浙江机械制造有限公司| 青州市拓新机械设备有限公司 | 首钢凯西钢铁有限公司| 柳州欧维姆机械有限公司| 浙江华安机械有限公司| 济南钢铁贸易有限公司| 山东峻峰起重机械有限公司 | 常州远见机械有限公司| 南京彩途机械设备有限公司| 慈溪市宏晟机械设备有限公司| 洛阳洛北重工机械有限公司| 莱州三和机械有限公司| 汉邦机械制造有限公司| 上海环球机械有限公司| 德瑞机械设备有限公司| 山东欧劲工程机械有限公司| 常州万高机械制造有限公司| 浙江佶龙机械有限公司| 机械有限公司 招聘| 滦南华瑞钢铁有限公司| 新乡市先锋振动机械有限公司| 苏州苏鹰机械制造有限公司| 东莞协鑫机械有限公司| 杭州 机械 有限公司| 汶瑞机械山东有限公司| 中山中炬精工机械有限公司| 上海港机重工有限公司| 德莱赛机械苏州有限公司| 输送机械设备有限公司| 亿佰通机械有限公司| 沂南县宏发机械有限公司| 扬州华粮机械有限公司| 固耐重工苏州有限公司| 欧亚德机械有限公司| 江苏苏东化工机械有限公司| 九江萍钢钢铁有限公司电话| 天津天丰钢铁有限公司| 山东欧劲工程机械有限公司| 钜业机械设备有限公司| 新劲力机械有限公司| 山东巨威机械有限公司| 上海起重设备有限公司| 东莞市通盛机械有限公司| 台州市机械有限公司| 浙江鼎力机械有限公司| 青岛张氏机械有限公司| 杭州金竺机械有限公司| 广东中远海运重工有限公司| 龙口金正机械有限公司| 成都康博机械有限公司| 福建三嘉钢铁有限公司| 大连科信机械有限公司| 注册机械设备有限公司有什么要求| 广西千里通机械设备有限公司| 西安普阳机械有限公司| 长兴诺力机械有限公司| 上海鼎龙机械有限公司| 广州乾能机械制造有限公司 | 兰州机械设备有限公司| 浙江东星纺织机械有限公司| 上海文胜机械设备有限公司| 北京机械租赁有限公司| 利德盛机械有限公司| 合肥逸飞包装机械有限公司| 常州经编机械有限公司| 泰州市海锋机械制造有限公司| 杭州龙云水利机械制造有限公司| 常州高凯精密机械有限公司 | 上海陆达包装机械制造有限公司 | 劲源机械设备有限公司| 湖南中旺工程机械设备有限公司| 上海齐耀重工有限公司| 杭州金丰机械有限公司| 上海化工机械厂有限公司| 重村钢模机械工业苏州有限公司| 上海板换机械设备有限公司| 东莞市利成机械有限公司| 山东三维重工有限公司| 豪利机械苏州有限公司| 浙江勇力机械有限公司| 固尔琦包装机械有限公司 | 青县冀丰钢铁有限公司| 徐州随车起重机有限公司 | 诚鑫诚机械有限公司| 江苏巨风机械制造有限公司| 山东恒旺机械有限公司| 深圳巨涛机械设备有限公司| 南阳医疗机械有限公司| 旭英机械有限公司招聘| 济南博威液压机械有限公司| 福建起然燃气设备有限公司| 北京工程机械有限公司| 山东萨丁重工有限公司| 威海新元化工机械有限公司| 浙江豪盛印刷机械有限公司| 恒达机械制造有限公司| 山东运泰机械有限公司| 佳先机械制造有限公司| 潍坊金蟀机械有限公司| 无锡马牌机械有限公司| 徐州华冶机械有限公司| 湖南龙凤机械制造有限公司| 上海海邦机械设备制造有限公司| 武汉市快诚机械有限公司| 盐城 机械 有限公司| 深圳 机械设备有限公司| 余姚 机械 有限公司| 机械设备出口有限公司| 淄博 机械制造有限公司| 力升机械有限公司.| 江重机械制造有限公司| 山东重型机械有限公司| 无锡印染机械有限公司| 农业机械制造有限公司| 焦作市机械有限公司| 常州 机械制造有限公司| 比富机械(东莞)有限公司| 自动化机械 上海有限公司| 山东机械份有限公司| 泰田液压机械有限公司| 昆山硕杰机械有限公司| 上海荣沃机械有限公司| 扬州伏尔坎机械制造有限公司| 上海纳丰机械设备有限公司| 山东信川机械有限公司| 河北钢铁矿业有限公司| 山东瀚业机械有限公司| 东方液压机械有限公司| 宁波佳尔灵气动机械有限公司| 昆成机械(昆山)有限公司| 山东山矿机械有限公司| 佛山市 重工有限公司| 宣城市 机械 有限公司| 佛山市强源钢铁有限公司| 安徽国梁机械设备有限公司| 唐山文丰钢铁有限公司| 珠海华亚机械有限公司| 力顺源机械有限公司| 青岛昌佳机械有限公司| 河北圣和农业机械有限公司| 机械电子制造有限公司| 大连宏大连杆机械制造有限公司| 温州市友田包装机械有限公司| 杭州中亚机械有限公司招聘| 山西太行钢铁有限公司| 上海合升机械有限公司| 烟台美丰机械有限公司| 新乡市利尔机械有限公司| 昆明机械设备有限公司| 尤工机械设备有限公司| 辽宁中冶石化机械有限公司| 江苏中科机械有限公司| 苏州昶智精密机械有限公司| 登福机械(上海)有限公司| 天津的机械设备有限公司| 苏州苏鹰机械制造有限公司| 桂林中天机械有限公司| 江苏舜工机械有限公司| 阜阳 机械 有限公司| 张家港市通惠化工机械有限公司 | 江阴荣兴机械有限公司| 山东瑞华工程机械有限公司 | 湖南威士重工机械有限公司| 河北州科重工有限公司| 宁波正凯机械有限公司| 山东讴神机械制造有限公司| 涂装机械设备有限公司| 山东博精化工机械有限公司 | 济宁四通工程机械有限公司| 威海精密机械有限公司| 太仓旭升机械有限公司| 常州福牛机械有限公司| 河北唐银钢铁有限公司| 天津市申成包装机械有限公司| 昆山协扬机械有限公司| 郑州中意矿山机械有限公司| 天津千百顺钢铁贸易有限公司| 川岛洗涤机械有限公司| 上海敏硕机械配件有限公司| 河北途盟机械制造有限公司| 莱州三和机械有限公司| 苏州伟鼎机械设备有限公司 | 鞍山机械制造有限公司| 南通牧野机械有限公司| 浙江创伟机械有限公司| 广东光信机械有限公司| 江苏永康机械有限公司| 上海创灵包装机械制造有限公司| 浙江金驰机械有限公司| 焦作市机械制造有限公司| 东莞市世翔精密机械制造有限公司| 宁波隆源精密机械有限公司| 山东小康机械有限公司| 定州市至信机械制造有限公司 | 济南华飞数控机械有限公司 | 杭州武林机械有限公司| 徐工工程机械有限公司| 宁波梦神床垫机械有限公司| 木工机械设备有限公司| 诸城晶品机械有限公司| 泰恒机械制造有限公司| 海宁诚达机械有限公司| 无锡兆立精密机械有限公司| 抚顺中兴重工有限公司| 江苏双轮泵业机械制造有限公司| 郑州 机械 有限公司| 金马机械制造有限公司| 安徽华机械有限公司| 济南恒迪机械有限公司| 新乡市先锋振动机械有限公司| 东莞市数控机械有限公司| 郑州矿山机械有限公司| 潍坊华耀磁电机械有限公司| 淮南凯盛重工有限公司| 宁波科鼎钢铁有限公司| 江淮重工机械有限公司| 河北东方德源机械制造有限公司 | 昆山苏隆机械制造有限公司| 重庆智茂机械制造有限公司| 厦门机械制造有限公司| 温州博大机械有限公司| 马氏木工机械有限公司| 新乡市矿山起重机械有限公司| 无锡万华机械有限公司| 无锡布勒机械制造有限公司招聘| 张家港机械有限公司| 青岛安成食品机械有限公司 | 张家港海狮洗涤机械有限公司| 重庆屯茂机械有限公司| 鑫泰数控机械有限公司| 徐工基础工程机械有限公司| 中航国际钢铁贸易有限公司| 宁波顺兴机械制造有限公司| 矿山起重机有限公司| 宁波天佳塑料机械有限公司| 无锡精工机械有限公司| 上海新沪机械有限公司| 江苏联鑫钢铁有限公司| 威海柳道机械有限公司| 山东首钢钢铁贸易有限公司| 北京明日之星玻璃机械有限公司| 佛山市强源钢铁有限公司| 青州泰达机械有限公司| 昆山大风机械有限公司| 浙江荣众机械有限公司| 郑州机械设备有限公司| 安徽华邦机械有限公司| 日照港达船舶重工有限公司| 济南金胜星机械设备有限公司| 铜陵群力机械有限公司| 江阴化工机械有限公司| 友嘉精密机械有限公司| 机械有限公司起名大全| 松源机械制造有限公司| 广西金达机械有限公司| 牡丹江机械有限公司| 东莞东久机械有限公司| 广州宏兴食品机械有限公司| 山东银鹰炊事机械有限公司| 山推楚天工程机械有限公司| 无锡东元精密机械有限公司| 山西中升钢铁有限公司| 徐州华冶机械有限公司| 上海捷如重工机电设备有限公司| 厦门银华机械有限公司| 南通铁军机械有限公司| 广州工友起重设备制造有限公司| 鑫盛机械制造有限公司| 洛阳机械设备有限公司| 洛阳泰红农业机械有限公司| 东莞科雄机械有限公司| 福州机械制造有限公司| 泉州宝隆机械有限公司| 青岛华磊塑料机械有限公司| 深圳起点云有限公司| 南京华创包装机械设备有限公司| 河北华昌机械设备有限公司| 北默压缩机械有限公司| 无锡市光彩机械制造有限公司| 贵州凯星液力传动机械有限公司 | 常州 机械 有限公司| 江苏中科机械有限公司| 宁波拓诚机械有限公司| 杭州机械设备有限公司| 张家港市港丰机械有限公司| 襄阳亚舟重型工程机械有限公司| 浙江精密机械有限公司| 飞迈烟台机械有限公司| 中航起落架有限公司| 东莞市金联吹塑机械有限公司| 首都航天机械有限公司| 福州协展机械有限公司| 安徽泰恒机械制造有限公司| 建筑机械设备有限公司| 康铖机械设备有限公司| 杭州萧山鼎立机械有限公司| 济南升降机械有限公司| 浙江金华机械有限公司| 广州益川机械有限公司| 维特根机械有限公司| 常州 机械有限公司| 重庆川凯机械有限公司| 浙江天鸿传动机械有限公司| 常州立达纺织机械有限公司| 岳阳神冈起重电磁铁有限公司| 永川海通机械有限公司| 上海应晓食品机械有限公司| 常州超通机械有限公司| 淄博推进化工机械有限公司| 常熟神马机械有限公司| 辽宁 机械制造有限公司| 苏州明基自动化机械设备有限公司| 上海起帆电线电缆有限公司| 扬州诺亚机械有限公司| 永腾弹簧机械设备有限公司| 东泰机械制造有限公司| 江阴宗承钢铁有限公司| 浙江双畅起重机械有限公司| 江苏方圣机械有限公司| 桂林中天机械有限公司| 临海机械有限公司招聘| 徐州利国钢铁有限公司| 柳州富达机械有限公司官网| 江苏恒悦机械有限公司| 唐山市德龙钢铁有限公司| 苏州欧比特机械有限公司| 常州豪凯机械有限公司| 上海的纸箱机械有限公司| 宁波固奇包装机械制造有限公司| 浙江中兴机械制造有限公司| 江苏纺织机械有限公司| 武汉 机械制造有限公司| 无锡建仪仪器机械有限公司| 广州工程机械有限公司| 上海佳成服装机械有限公司| 宝德机械国际有限公司| 广西柳工机械有限公司| 云南昆鼎机械设备有限公司| 江西凯奥机械有限公司| 青岛新大成塑料机械有限公司| 山东平安工程机械有限公司| 台州市四海机械有限公司| 郑州市昌利机械制造有限公司| 合肥 机械有限公司| 凯伯精密机械有限公司| 新疆昆玉钢铁有限公司| 安丘瑞源机械制造有限公司| 佛山市 重工有限公司| 宏达机械制造有限公司| 钜业机械设备有限公司| 上海奉业包装机械有限公司| 泰兴机械制造有限公司| 华东油压机械制造有限公司| 佛山市劲雄机械有限公司| 诸城市美川机械有限公司| 杭州金狮机械有限公司| 东光包装机械有限公司| 苏州海盛精密机械有限公司| 诚泰精密机械有限公司| 化工有限公司起名大全| 温州科迪机械有限公司| 咸阳 机械制造有限公司| 广东食品机械有限公司| 新乡市长城机械制造有限公司| 上海西马特制药机械有限公司 | 北京骏马机械有限公司| 沈阳冶金机械有限公司| 上海机械成套设备有限公司| 济宁福康机械加工有限公司| 昆山台一精密机械有限公司 | 上海宇意机械有限公司| 泰而勒食品机械贸易(上海)有限公司 | 滦南华瑞钢铁有限公司| 曲阜天阳机械有限公司| 沈阳重工食品有限公司| 广西玉柴重工有限公司| 东莞市天周机械有限公司| 中山伙伴自动化机械有限公司 | 泰安正阳机械有限公司| 平湖英厚机械有限公司| 宁波裕民机械工业有限公司| 山东食品机械有限公司| 盐城市丰特铸造机械有限公司| 安丰钢铁有限公司电话| 东莞木工机械有限公司| 丽驰精密机械有限公司| 山西机械制造有限公司| 昆明机械设备有限公司| 宏祥建筑机械有限公司| 湖州二轻机械有限公司| 江苏三麦食品机械有限公司| 徐州二川机械有限公司| 四川川宏机械有限公司| 山东隆盛钢铁有限公司| 涿州北方重工设备设计有限公司 | 青岛科尼乐机械设备有限公司| 河北永洋钢铁有限公司详细地址 | 合肥成龙钢铁有限公司| 中机北方机械有限公司| 邢台机械轧辊有限公司| 常州市龙鑫化工机械有限公司 | 东方液压机械有限公司| 昆明机械设备有限公司| 温岭华驰机械有限公司| 江苏大明重工有限公司| 阜阳 机械 有限公司| 河南鼎科机械有限公司| 洛阳鑫超机械有限公司| 泉州市工程机械有限公司| 东莞市益彩机械有限公司| 重庆九源机械有限公司| 上海液压机械有限公司| 上海山美重型矿山机械有限公司| 山东建昌机械有限公司| 江阴市机械制造有限公司| 云南中天机械有限公司| 浙江天鸿传动机械有限公司| 青岛慧洋梳理机械有限公司| 江苏瑞德机械有限公司| 禹城 机械 有限公司| 上海展焱包装机械有限公司| 长沙力诺机械有限公司| 南京一嘉起重机械制造有限公司 | 昆山市机械制造有限公司| 广州起航贸易有限公司| 山东瀚业机械有限公司| 沈阳机械制造有限公司| 江苏科圣化工机械有限公司| 娄底 机械有限公司| 诸城市放心食品机械有限公司| 浙江飞挺机械有限公司| 杭州萧山凯兴食品机械有限公司 | 北京大起空调有限公司| 中航国际钢铁贸易有限公司| 广州汉牛机械设备有限公司 | 威海盛世机械有限公司| 德州宝鼎液压机械有限公司 | 盐城市丰特铸造机械有限公司| 上海长空机械有限公司| 上海中机械有限公司| 山东博宇机械有限公司| 济宁山矿机械有限公司| 苏州丰裕机械工程有限公司 | 勤堡精密机械有限公司| 中山精密机械有限公司| 海盐鼎盛机械有限公司| 山东液压机械有限公司| 苏州福润机械有限公司| 上海与鑫机械有限公司| 同鼎机械设备有限公司| 青岛明高机械有限公司| 唐山鑫达钢铁有限公司| 常州朝康机械有限公司| 江苏汉鼎机械有限公司| 东莞市台克机械有限公司| 西安北村精密机械有限公司| 佛山市钲昌机械设备有限公司| 东莞正扬电子机械有限公司| 合肥成龙钢铁有限公司|