当前位置: 首页 > news >正文

怎么样黑进网站后台上海网络广告公司

怎么样黑进网站后台,上海网络广告公司,营销网络建设怎么写,动易网站官网什么是Remoting#xff0c;简而言之#xff0c;我们可以将其看作是一种分布式处理方式。从微软的产品角度来看#xff0c;可以说Remoting就是DCOM的一种升级#xff0c;它改善了很多功能#xff0c;并极好的融合到.Net平台下。Microsoft .NET Remoting 提供了一种允许对象…  什么是Remoting简而言之我们可以将其看作是一种分布式处理方式。从微软的产品角度来看可以说Remoting就是DCOM的一种升级它改善了很多功能并极好的融合到.Net平台下。Microsoft .NET Remoting 提供了一种允许对象通过应用程序域与另一对象进行交互的框架。这也正是我们使用Remoting的原因。为什么呢在Windows操作系统中是将应用程序分离为单独的进程。这个进程形成了应用程序代码和数据周围的一道边界。如果不采用进程间通信RPC机制则在一个进程中执行的代码就不能访问另一进程。这是一种操作系统对应用程序的保护机制。然而在某些情况下我们需要跨过应用程序域与另外的应用程序域进行通信即穿越边界。   在Remoting中是通过通道channel来实现两个应用程序域之间对象的通信的。首先客户端通过Remoting访问通道以获得服务端对象再通过代理解析为客户端对象。这就提供一种可能性即以服务的方式来发布服务器对象。远程对象代码可以运行在服务器上如服务器激活的对象和客户端激活的对象然后客户端再通过Remoting连接服务器获得该服务对象并通过序列化在客户端运行。   在Remoting中对于要传递的对象设计者除了需要了解通道的类型和端口号之外无需再了解数据包的格式。但必须注意的是客户端在获取服务器端对象时并不是获得实际的服务端对象而是获得它的引用。这既保证了客户端和服务器端有关对象的松散耦合同时也优化了通信的性能。 Remoting的两种通道   Remoting的通道主要有两种Tcp和Http。在.Net中System.Runtime.Remoting.Channels中定义了 IChannel接口。IChannel接口包括了TcpChannel通道类型和Http通道类型。它们分别对应Remoting通道的这两种类型。   TcpChannel类型放在名字空间System.Runtime.Remoting.Channels.Tcp中。Tcp通道提供了基于Socket 的传输工具使用Tcp协议来跨越Remoting边界传输序列化的消息流。TcpChannel类型默认使用二进制格式序列化消息对象因此它具有更高的传输性能。HttpChannel类型放在名字空间System.Runtime.Remoting.Channels.Http中。它提供了一种使用 Http协议使其能在Internet上穿越防火墙传输序列化消息流。默认情况下HttpChannel类型使用Soap格式序列化消息对象因此它具有更好的互操作性。通常在局域网内我们更多地使用TcpChannel如果要穿越防火墙则使用HttpChannel。 远程对象的激活方式   在访问远程类型的一个对象实例之前必须通过一个名为Activation的进程创建它并进行初始化。这种客户端通过通道来创建远程对象称为对象的激活。在Remoting中远程对象的激活分为两大类服务器端激活和客户端激活。   服务器端激活又叫做WellKnow方式很多又翻译为知名对象。为什么称为知名对象激活模式呢是因为服务器应用程序在激活对象实例之前会在一个众所周知的统一资源标识符(URI)上来发布这个类型。然后该服务器进程会为此类型配置一个WellKnown对象并根据指定的端口或地址来发布对象。. Net Remoting把服务器端激活又分为SingleTon模式和SingleCall模式两种。   SingleTon模式此为有状态模式。如果设置为SingleTon激活方式则Remoting将为所有客户端建立同一个对象实例。当对象处于活动状态时 SingleTon实例会处理所有后来的客户端访问请求而不管它们是同一个客户端还是其他客户端。SingleTon实例将在方法调用中一直维持其状态。举例来说如果一个远程对象有一个累加方法i0i被多个客户端例如两个调用。如果设置为SingleTon方式则第一个客户获得值为1第二个客户获得值为2因为他们获得的对象实例是相同的。如果熟悉Asp.Net的状态管理我们可以认为它是一种Application状态。   SingleCall模式SingleCall是一种无状态模式。一旦设置为SingleCall模式则当客户端调用远程对象的方法时 Remoting会为每一个客户端建立一个远程对象实例至于对象实例的销毁则是由GC自动管理的。同上一个例子而言则访问远程对象的两个客户获得的都是1。我们仍然可以借鉴Asp.Net的状态管理认为它是一种Session状态。   客户端激活。与WellKnown模式不同 Remoting在激活每个对象实例的时候会给每个客户端激活的类型指派一个URI。客户端激活模式一旦获得客户端的请求将为每一个客户端都建立一个实例引用。SingleCall模式和客户端激活模式是有区别的首先对象实例创建的时间不一样。客户端激活方式是客户一旦发出调用的请求就实例化而SingleCall则是要等到调用对象方法时再创建。其次SingleCall模式激活的对象是无状态的对象生命期的管理是由GC管理的而客户端激活的对象则有状态其生命周期可自定义。其三两种激活模式在服务器端和客户端实现的方法不一样。尤其是在客户端SingleCall模式是由 GetObject()来激活它调用对象默认的构造函数。而客户端激活模式则通过CreateInstance()来激活它可以传递参数所以可以调用自定义的构造函数来创建实例。 远程对象的定义   前面讲到客户端在获取服务器端对象时并不是获得实际的服务端对象而是获得它的引用。因此在Remoting中对于远程对象有一些必须的定义规范要遵循。   由于Remoting传递的对象是以引用的方式因此所传递的远程对象类必须继承MarshalByRefObject。MSDN对 MarshalByRefObject的说明是MarshalByRefObject 是那些通过使用代理交换消息来跨越应用程序域边界进行通信的对象的基类。不是从 MarshalByRefObject 继承的对象会以隐式方式按值封送。当远程应用程序引用一个按值封送的对象时将跨越远程处理边界传递该对象的副本。因为您希望使用代理方法而不是副本方法进行通信因此需要继承MarshallByRefObject。   在Remoting中能够传递的远程对象可以是各种类型包括复杂的DataSet对象只要它能够被序列化。远程对象也可以包含事件但服务器端对于事件的处理比较特殊我将在本系列之三中介绍。 服务器端   根据第一部分所述根据激活模式的不同通道类型的不同服务器端的实现方式也有所不同。大体上说服务器端应分为三步   1、注册通道   要跨越应用程序域进行通信必须实现通道。如前所述Remoting提供了IChannel接口分别包含TcpChannel和HttpChannel两种类型的通道。这两种类型除了性能和序列化数据的格式不同外实现的方式完全一致因此下面我们就以TcpChannel为例。   注册TcpChannel首先要在项目中添加引用“System.Runtime.Remoting”然后using名字空间System.Runtime.Remoting.Channel.Tcp。代码如下   TcpChannel channel  new TcpChannel(8080);   ChannelServices.RegisterChannel(channel);   在实例化通道对象时将端口号作为参数传递。然后再调用静态方法RegisterChannel()来注册该通道对象即可。   2、注册远程对象   注册了通道后要能激活远程对象必须在通道中注册该对象。根据激活模式的不同注册对象的方法也不同。   (1) SingleTon模式   对于WellKnown对象可以通过静态方法RemotingConfiguration.RegisterWellKnownServiceType()来实现RemotingConfiguration.RegisterWellKnownServiceType(   typeof(ServerRemoteObject.ServerObject),   ServiceMessage,WellKnownObjectMode.SingleTon);   (2)SingleCall模式   注册对象的方法基本上和SingleTon模式相同只需要将枚举参数WellKnownObjectMode改为SingleCall就可以了。RemotingConfiguration.RegisterWellKnownServiceType(   typeof(ServerRemoteObject.ServerObject),   ServiceMessage,WellKnownObjectMode.SingleCall);   (3)客户端激活模式   对于客户端激活模式使用的方法又有不同但区别不大看了代码就一目了然。   RemotingConfiguration.ApplicationName  ServiceMessage;   RemotingConfiguration.RegisterActivatedServiceType(   typeof(ServerRemoteObject.ServerObject));   为什么要在注册对象方法前设置ApplicationName属性呢其实这个属性就是该对象的URI。对于WellKnown模式URI是放在RegisterWellKnownServiceType()方法的参数中当然也可以拿出来专门对ApplicationName属性赋值。而RegisterActivatedServiceType()方法的重载中没有ApplicationName的参数所以必须分开。   3、注销通道   如果要关闭Remoting的服务则需要注销通道也可以关闭对通道的监听。在Remoting中当我们注册通道的时候就自动开启了通道的监听。而如果关闭了对通道的监听则该通道就无法接受客户端的请求但通道仍然存在如果你想再一次注册该通道会抛出异常。   //获得当前已注册的通道   IChannel[] channels  ChannelServices.RegisteredChannels;   //关闭指定名为MyTcp的通道   foreach (IChannel eachChannel in channels)   {   if (eachChannel.ChannelName  MyTcp)   {   TcpChannel tcpChannel  (TcpChannel)eachChannel;   //关闭监听   tcpChannel.StopListening(null);   //注销通道   ChannelServices.UnregisterChannel(tcpChannel);   }   }   代码中RegisterdChannel属性获得的是当前已注册的通道。在Remoting中是允许同时注册多个通道的这一点会在后面说明。   客户端   客户端主要做两件事一是注册通道。这一点从图一就可以看出Remoting中服务器端和客户端都必须通过通道来传递消息以获得远程对象。第二步则是获得该远程对象。   1、注册通道   TcpChannel channel  new TcpChannel();   ChannelServices.RegisterChannel(channel);   注意在客户端实例化通道时是调用的默认构造函数即没有传递端口号。事实上这个端口号是缺一不可的只不过它的指定被放在后面作为了Uri的一部分。     2、获得远程对象。   与服务器端相同不同的激活模式决定了客户端的实现方式也将不同。不过这个区别仅仅是WellKnown激活模式和客户端激活模式之间的区别而对于SingleTon和SingleCall模式客户端的实现完全相同。   (1) WellKnown激活模式   要获得服务器端的知名远程对象可通过Activator进程的GetObject()方法来获得   ServerRemoteObject.ServerObject serverObj  (ServerRemoteObject.ServerObject)Activator.GetObject(   typeof(ServerRemoteObject.ServerObject), tcp://localhost:8080/ServiceMessage);   首先以WellKnown模式激活客户端获得对象的方法是使用GetObject。其中参数第一个是远程对象的类型。第二个参数就是服务器端的uri。如果是http通道自然是用了。因为我是用本地机所以这里是localhost你可以用具体的服务器IP地址来代替它。端口必须和服务器端的端口一致。后面则是服务器定义的远程对象服务名即ApplicationName属性的内容。     (2) 客户端激活模式   如前所述WellKnown模式在客户端创建对象时只能调用默认的构造函数上面的代码就说明了这一点因为GetObject()方法不能传递构造函数的参数。而客户端激活模式则可以通过自定义的构造函数来创建远程对象。   客户端激活模式有两种方法   1) 调用RemotingConfiguration的静态方法RegisterActivatedClientType()。这个方法返回值为Void它只是将远程对象注册在客户端而已。具体的实例化还需要调用对象类的构造函数。   RemotingConfiguration.RegisterActivatedClientType(    typeof(ServerRemoteObject.ServerObject),   tcp://localhost:8080/ServiceMessage);   ServerRemoteObject.ServerObject serverObj  new ServerRemoteObject.ServerObject();   2) 调用进程Activator的CreateInstance()方法。这个方法将创建方法参数指定类型的类对象。它与前面的GetObject()不同的是它要在客户端调用构造函数而GetObject()只是获得对象而创建实例是在服务器端完成的。CreateInstance()方法有很多个重载我着重说一下其中常用的两个。   a、 public static object CreateInstance(Type type, object[] args, object[] activationAttributes);   参数说明   type要创建的对象的类型。   args 与要调用构造函数的参数数量、顺序和类型匹配的参数数组。如果 args 为空数组或空引用Visual Basic 中为 Nothing则调用不带任何参数的构造函数默认构造函数。   activationAttributes 包含一个或多个可以参与激活的属性的数组。   这里的参数args是一个object[]数组类型。它可以传递要创建对象的构造函数中的参数。从这里其实可以得到一个结论WellKnown激活模式所传递的远程对象类只能使用默认的构造函数而Activated模式则可以用户自定义构造函数。activationAttributes参数在这个方法中通常用来传递服务器的url。   假设我们的远程对象类ServerObject有个构造函数   ServerObject(string pName,string pSex,int pAge)   {   name  pName;   sex  pSex;   age  pAge;   }   那么实现的代码是   object[] attrs  {new UrlAttribute(tcp://localhost:8080/ServiceMessage)};   object[] objs  new object[3];   objs[0]  wayfarer;   objs[1]  male;   objs[2]  28;   ServerRemoteObject.ServerObject  Activator.CreateInstance(   typeof(ServerRemoteObject.ServerObject),objs,attrs);   可以看到objs[]数组传递的就是构造函数的参数。   b、public static ObjectHandle CreateInstance(string assemblyName, string typeName, object[] activationAttribute);   参数说明   assemblyName 将在其中查找名为 typeName 的类型的程序集的名称。如果 assemblyName 为空引用Visual Basic 中为 Nothing则搜索正在执行的程序集。   typeName首选类型的名称。   activationAttributes 包含一个或多个可以参与激活的属性的数组。   参数说明一目了然。注意这个方法返回值为ObjectHandle类型因此代码与前不同   object[] attrs  {new UrlAttribute(tcp://localhost:8080/EchoMessage)};    ObjectHandle handle  Activator.CreateInstance(ServerRemoteObject,   ServerRemoteObject.ServerObject,attrs);   ServerRemoteObject.ServerObject obj  (ServerRemoteObject.ServerObject)handle.Unwrap();   这个方法实际上是调用的默认构造函数。ObjectHandle.Unwrap()方法是返回被包装的对象。   说明要使用UrlAttribute还需要在命名空间中添加using System.Runtime.Remoting.Activation; Remoting的基础补充   通过上面的描述基本上已经完成了一个最简单的Remoting程序。这是一个标准的创建Remoting程序的方法但在实际开发过程中我们遇到的情况也许千奇百怪如果只掌握一种所谓的“标准”就妄想可以“一招鲜、吃遍天”是不可能的。   1、注册多个通道   在Remoting中允许同时创建多个通道即根据不同的端口创建不同的通道。但是Remoting要求通道的名字必须不同因为它要用来作为通道的唯一标识符。虽然IChannel有ChannelName属性但这个属性是只读的。因此前面所述的创建通道的方法无法实现同时注册多个通道的要求。   这个时候我们必须用到System.Collection中的IDictionary接口   注册Tcp通道   IDictionary tcpProp  new Hashtable();   tcpProp[name]  tcp9090;   tcpProp[port]  9090;   IChannel channel  new TcpChannel(tcpProp,   new BinaryClientFormatterSinkProvider(),   new BinaryServerFormatterSinkProvider());   ChannelServices.RegisterChannel(channel);   注册Http通道   IDictionary httpProp  new Hashtable();   httpProp[name]  http8080;   httpProp[port]  8080;   IChannel channel  new HttpChannel(httpProp,   new SoapClientFormatterSinkProvider(),   new SoapServerFormatterSinkProvider());   ChannelServices.RegisterChannel(channel);   在name属性中定义不同的通道名称就可以了。   2、远程对象元数据相关性   由于服务器端和客户端都要用到远程对象通常的方式是生成两份完全相同的对象Dll分别添加引用。不过为了代码的安全性且降低客户端对远程对象元数据的相关性我们有必要对这种方式进行改动。即在服务器端实现远程对象而在客户端则删除这些实现的元数据。   由于激活模式的不同在客户端创建对象的方法也不同所以要分离元数据的相关性也应分为两种情况。   (1) WellKnown激活模式   通过接口来实现。在服务器端提供接口和具体类的实现而在客户端仅提供接口   public interface IServerObject   {   Person GetPersonInfo(string name,string sex,int age);   }   public class ServerObject:MarshalByRefObject,IServerObject   { ......}   注意两边生成该对象程序集的名字必须相同严格地说是命名空间的名字必须相同。   (2) 客户端激活模式   如前所述对于客户端激活模式不管是使用静态方法还是使用CreateInstance()方法都必须在客户端调用构造函数实例化对象。所以在客户端我们提供的远程对象就不能只提供接口而没有类的实现。实际上要做到与远程对象元数据的分离可以由两种方法供选择   a、利用WellKnown激活模式模拟客户端激活模式   方法是利用设计模式中的“抽象工厂”下面的类图表描述了总体解决方案   我们在服务器端的远程对象中加上抽象工厂的接口和实现类   public interface IServerObject   {   Person GetPersonInfo(string name,string sex,int age);   }   public interface IServerObjFactory   {   IServerObject CreateInstance();    }   public class ServerObject:MarshalByRefObject,IServerObject   {   public Person GetPersonInfo(string name,string sex,int age)   {   Person person  new Person();   person .Name  name;   person.Sex  sex;   person.Age  age;   return person;   }    }   public class ServerObjFactory:MarshalByRefObject,IServerObjFactory   {   public IServerObject CreateInstance()   {   return new ServerObject();   }   }   然后再客户端的远程对象中只提供工厂接口和原来的对象接口   public interface IServerObject   {   Person GetPersonInfo(string name,string sex,int age);   }   public interface IServerObjFactory   {   IServerObject CreateInstance();    }   我们用WellKnown激活模式注册远程对象在服务器端   //传递对象   RemotingConfiguration.RegisterWellKnownServiceType(   typeof(ServerRemoteObject.ServerObjFactory),   ServiceMessage,WellKnownObjectMode.SingleCall);   注意这里注册的不是ServerObject类对象而是ServerObjFactory类对象。   客户端   ServerRemoteObject.IServerObjFactory serverFactory     (ServerRemoteObject.IServerObjFactory) Activator.GetObject(   typeof(ServerRemoteObject.IServerObjFactory),   tcp://localhost:8080/ServiceMessage);   ServerRemoteObject.IServerObject serverObj  serverFactory.CreateInstance();   为什么说这是一种客户端激活模式的模拟呢从激活的方法来看我们是使用了SingleCall模式来激活对象但此时激活的并非我们要传递的远程对象而是工厂对象。如果客户端要创建远程对象还应该通过工厂对象的CreateInstance()方法来获得。而这个方法正是在客户端调用的。因此它的实现方式就等同于客户端激活模式。   b、利用替代类来取代远程对象的元数据   实际上我们可以用一个trick来欺骗Remoting。这里所说的替代类就是这个trick了。既然是提供服务Remoting传递的远程对象其实现的细节当然是放在服务器端。而要在客户端放对象的副本不过是因为客户端必须调用构造函数而采取的无奈之举。既然具体的实现是在服务器端又为了能在客户端实例化那么在客户端就实现这些好了。至于实现的细节就不用管了。   如果远程对象有方法服务器端则提供方法实现而客户端就提供这个方法就OK了至于里面的实现你可以是抛出一个异常或者return 一个null值如果方法返回void那么里面可以是空。关键是这个客户端类对象要有这个方法。这个方法的实现其实和方法的声明差不多所以我说是一个trick。方法如是构造函数也如此。   还是用代码来说明这种“阴谋”更直观   服务器端   public class ServerObject:MarshalByRefObject   {   public ServerObject()   {   }   public Person GetPersonInfo(string name,string sex,int age)   {   Person person  new Person();   person .Name  name;   person.Sex  sex;   person.Age  age;   return person;   }    }   客户端   public class ServerObject:MarshalByRefObject   {   public ServerObj()   {   throw new System.NotImplementedException();   }   public Person GetPersonInfo(string name,string sex,int age)   {   throw new System.NotImplementedException();   }    }   比较客户端和服务器端客户端的方法GetPersonInfo()没有具体的实现细节只是抛出了一个异常。或者直接写上语句return null照样OK。我们称客户端的这个类为远程对象的替代类。   3、利用配置文件实现   前面所述的方法于服务器uri、端口、以及激活模式的设置是用代码来完成的。其实我们也可以用配置文件来设置。这样做有个好处因为这个配置文件是Xml文档。如果需要改变端口或其他我们就不需要修改程序并重新编译而是只需要改变这个配置文件即可。   (1) 服务器端的配置文件   lt;configurationgt;   lt;system.runtime.remotinggt;   lt;application nameServerRemotinggt;   lt;servicegt;   lt;wellknown modeSingleton typeServerRemoteObject.ServerObject objectUriServiceMessage/gt;   lt;/servicegt;   lt;channelsgt;   lt;channel reftcp port8080/gt;   lt;/channelsgt;   lt;/applicationgt;   lt;/system.runtime.remotinggt;   lt;/configurationgt;   如果是客户端激活模式则把wellknown改为activated同时删除mode属性。   把该配置文件放到服务器程序的应用程序文件夹中命名为ServerRemoting.config。那么前面的服务器端程序直接用这条语句即可   RemotingConfiguration.Configure(ServerRemoting.config);   (2) 客户端配置文件   如果是客户端激活模式修改和上面一样。调用也是使用RemotingConfiguration.Configure()方法来调用存储在客户端的配置文件。   配置文件还可以放在machine.config中。如果客户端程序是web应用程序则可以放在web.config中。   4、启动/关闭指定远程对象   Remoting中没有提供类似UnregisterWellKnownServiceType()的方法也即是说一旦通过注册了远程对象如果没有关闭通道的话该对象就一直存在于通道中。只要客户端激活该对象就会创建对象实例。如果Remoting传送的只有一个远程对象这不存在问题关闭通道就可以了。如果传送多个远程对象呢要关闭指定的远程对象应该怎么做关闭之后又需要启动又该如何   我们注意到在Remoting中提供了Marshal()和Disconnect()方法答案就在这里。Marshal()方法是将MarshalByRefObject类对象转化为ObjRef类对象这个对象是存储生成代理以与远程对象通讯所需的所有相关信息。这样就可以将该实例序列化以便在应用程序域之间以及通过网络进行传输客户端就可以调用了。而Disconnect()方法则将具体的实例对象从通道中断开。   方法如下   首先注册通道   TcpChannel channel  new TcpChannel(8080);   ChannelServices.RegisterChannel(channel);   接着启动服务   先在服务器端实例化远程对象。   ServerObject obj  new ServerObject();   然后注册该对象。注意这里不用RemotingConfiguration.RegisterWellKnownServiceType()而是使用RemotingServices.Marshal()   ObjRef objrefWellKnown  RemotingServices.Marshal(obj, ServiceMessage);   如果要注销对象则   RemotingServices.Disconnect(obj);   要注意这里Disconnect的类对象必须是前面实例化的对象。正因为此我们可以根据需要创建指定的远程对象而关闭时则Disconnect之前实例化的对象。   至于客户端的调用和前面WellKnown模式的方法相同仍然是通过Activator.GetObject()来获得。但从实现代码来看我们会注意到一个问题由于服务器端是显式的实例化了远程对象因此不管客户端有多少是否相同它们调用的都是同一个远程对象。因此我们将这个方法称为模拟的SingleTon模式。   客户端激活模式   我们也可以通过Marshal()和Disconnect()来模拟客户端激活模式。首先我们来回顾“远程对象元数据相关性”一节在这一节中我说到采用设计模式的“抽象工厂”来创建对象实例以此用SingleCall模式来模拟客户端激活模式。在仔细想想前面的模拟的SingleTon模式。是不是答案就将呼之欲出呢   在“模拟的SingleTon”模式中我们是将具体的远程对象实例进行Marshal以此让客户端获得该对象的引用信息。那么我们换一种思路当我们用抽象工厂提供接口工厂类实现创建远程对象的方法。然后我们在服务器端创建工厂类实例。再将这个工厂类实例进行Marshal。而客户端获取对象时不是获取具体的远程对象而是获取具体的工厂类对象。然后再调用CreateInstance()方法来创建具体的远程对象实例。此时对于多个客户端而言调用的是同一个工厂类对象然而远程对象是在各个客户端自己创建的因此对于远程对象而言则是由客户端激活创建的是不同对象了。   当我们要启动/关闭指定对象时只需要用Disconnet()方法来注销工厂类对象就可以了。 小结   Microsoft  .Net Remoting真可以说是博大精深。整个Remoting的内容不是我这一篇小文所能尽述的更不是我这个Remoting的初学者所能掌握的。王国维在《人间词话》一书中写到古今之成大事业大学问者必经过三种境界。“昨夜西风凋碧树独上高楼望尽天涯路。”此第一境界也。“衣带渐宽终不悔为伊消得人憔悴。”此第二境界也。“众里寻他千百度蓦然回首那人却在灯火阑珊处。”此第三境界也。如以此来形容我对Remoting的学习还处于“独上高楼望尽天涯路”的时候真可以说还未曾登堂入室。   或许需得“衣带渐宽”学得Remoting“终不悔”方才可以“蓦然回首”吧。   本文转载百度百科Remoting
http://www.zqtcl.cn/news/568995/

相关文章:

  • 清远 网站建设自己做的网站怎么发布
  • 可以做免费推广的网站短视频app有哪些
  • 班级网站建设的系统概述wordpress品牌分类
  • 学做网站论坛第六节个人网站注册公司
  • 网站宣传怎样做不违法做网络平台的网站有哪些
  • 网站建设go邢台集团网站建设报价
  • 哪个网站做appwordpress改成织梦
  • 重庆南岸营销型网站建设公司推荐o2o平台网站建设
  • 网站建设横向发展纵向发展贵阳网站建设外包
  • 网站建设的解决方案南京网站搜索排名
  • 网站怎么做背景衡阳网页定制
  • h5做网站用什么软件中英版网站系统
  • 汕头中英文网站推广wordpress取回密码收不到邮件
  • 外贸在线网站建站wordpress开放注册
  • 桂林餐饮兼职网站建设如何在百度上建网站
  • 怎样做免费网站的推广便宜点的网站空间
  • 中国建设部网站失信名单自己做公司网站难吗
  • 济南做网站需要多少钱园区网站到底怎么建设
  • 武清做网站的公司wordpress商城
  • 网站建设的实训技术总结sql 新建网站
  • 开发网站多少钱网站文件目录结构
  • 网站规划和建设的步骤做网站用的各种图标大全
  • 网站公司查询js代码网站大全
  • 湘潭网站建设价格最新新闻热点事件100字
  • 音乐网站程序源码wordpress模板中文版
  • 网站建设计划表wordpress主题 大
  • 在手机制作网站书店网站建设技术风险
  • 爱站网域名查询wordpress自定义标题关键词描述
  • 西安学校网站建设报价建盏
  • 网页 网站 区别东莞手机app开发