分布式架构剖析
传统C/S架构
|
XML Web Service
|
Remoting
|
Enterprise Service
|
WSE
|
MSMQ
|
WCF
|
跨平台
|
√
|
|
|
|
|
√
|
.net到.net
|
|
√
|
|
|
|
√
|
分布式事务
|
|
|
√
|
|
|
√
|
安全可靠
|
|
|
|
√
|
|
√
|
消息队列
|
|
|
|
|
√
|
√
|
分布式:一
WebServices demo1
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Web; 5 using System.Web.Services; 6 using System.Data; 7 using System.IO; 8 using System.Runtime.Serialization.Formatters.Binary; 9 namespace WebService1 10 { 11 /// <summary> 12 /// Service1 的摘要说明 13 /// </summary> 14 [WebService(Namespace = "http://tempuri.org/")] 15 [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 16 [System.ComponentModel.ToolboxItem(false)] 17 // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 18 // [System.Web.Script.Services.ScriptService] 19 public class Service1 : System.Web.Services.WebService 20 { 21 22 [WebMethod(Description = "测试")] 23 public string HelloWorld() 24 { 25 return "Hello World"; 26 } 27 [WebMethod(Description = "测试")] 28 public string GetServerTime() 29 { 30 return "Server current Time:" + DateTime.Now; 31 } 32 33 [WebMethod(Description = "测试")] 34 public int[] GetArrays() 35 { 36 return new int[] { 1, 2, 3, 3, 5 }; 37 } 38 39 [WebMethod] 40 public DataTable GetDataTable() 41 { 42 DataTable dt = new DataTable("emp"); 43 dt.Columns.Add("员工号"); 44 dt.Columns.Add("姓名"); 45 dt.Columns.Add("年龄"); 46 dt.Columns.Add("公司"); 47 DataRow dr = dt.NewRow(); 48 dr["员工号"] = "001"; 49 dr["姓名"] = "peter.peng"; 50 dr["年龄"] = "100"; 51 dr["公司"] = "hcc"; 52 dt.Rows.Add(dr); 53 return dt; 54 } 55 56 57 [WebMethod] 58 public Byte [] GetDataTable1() 59 { 60 DataTable dt = new DataTable();//这样如果不加表名webServices就不会序列化它,就会有问题。 61 dt.Columns.Add("员工号"); 62 dt.Columns.Add("姓名"); 63 dt.Columns.Add("年龄"); 64 dt.Columns.Add("公司"); 65 DataRow dr = dt.NewRow(); 66 dr["员工号"] = "001"; 67 dr["姓名"] = "peter.peng"; 68 dr["年龄"] = "100"; 69 dr["公司"] = "hcc"; 70 dt.Rows.Add(dr); 71 72 //这里就要手动的序化列 73 74 BinaryFormatter bf = new BinaryFormatter(); 75 MemoryStream ms = new MemoryStream();//内存流 76 bf.Serialize(ms, dt);//把对像序化成内存流 77 byte[] bt = ms.ToArray();//把内存中的流数据直可以转成数组 78 ms.Close();//别忘了关掉流 79 return bt; ; 80 } 81 } 82 }
View Code
1 private void button2_Click(object sender, EventArgs e) 2 { 3 Host.WebServices.Services1.Service1SoapClient _client = new Host.WebServices.Services1.Service1SoapClient(); 4 string ss = _client.GetServerTime(); 5 } 6 7 private void button1_Click(object sender, EventArgs e) 8 { 9 Host.WebServices.Services1.Service1SoapClient _client = new Host.WebServices.Services1.Service1SoapClient(); 10 byte[] bufferData = _client.GetDataTable1(); 11 12 BinaryFormatter bf = new BinaryFormatter(); 13 MemoryStream ms = new MemoryStream(bufferData);//把字节数据转换成流 14 DataTable dt = bf.Deserialize(ms) as DataTable; 15 this.dataGridView1.DataSource = dt; 16 }
View Code
异步调用WebServices(添加web引用)
其它后台的方法写的都一样,只是前端调用的时候用一个事件触发,如下代码所示
1 public string sss = null; 2 void host_HelloWorldCompleted(object sender, HelloWorldCompletedEventArgs e) 3 { 4 sss = e.Result; 5 } 6 protected void Button1_Click(object sender, EventArgs e) 7 { 8 Host.Services1.Service1 host = new Service1(); 9 host.HelloWorldCompleted += new HelloWorldCompletedEventHandler(host_HelloWorldCompleted); 10 host.GetHelloAsync(); 11 }
View Code
分布式二:
Remoting demo1
第一层:接口
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace ClassLibrary1 7 { 8 public interface IHello 9 { 10 string Hello(string name); 11 } 12 }
View Code
第二层:服务端
1 private void button1_Click(object sender, EventArgs e) 2 { 3 TcpChannel channel = new TcpChannel(3333);//step 1 4 5 ChannelServices.RegisterChannel(channel, false);//step 2 register channel 6 7 RemotingConfiguration.RegisterWellKnownServiceType(typeof(MyHello), "hello", WellKnownObjectMode.SingleCall);//注册远程对象 8 9 this.label1.Text = "server is running.."; 10 }
View Code
第三层:前台(引用接口)
1 IHello myHello = Activator.GetObject(typeof(IHello), "tcp://127.0.0.1:3333/hello") as IHello; 2 3 this.label1.Text = myHello.Hello("peter.peng");
View Code
分布式三:WCF